2011-04-24 58 views
0

说我有下一个模型字段:设定值与的选择

STATUS_CHOICES = (
    (0, 'open'), 
    (1, 'close'), 
) 

class Topic(models.Model): 
    user = models.ForeignKey(User) 
    text = models.TextField() 
    date = models.DateTimeField(auto_now_add=True) 
    status = models.SmallIntegerField(default=0, choices=STATUS_CHOICES) 
    status_date = models.DateTimeField(null=True, blank=True) 

我尝试在URL发送状态(“打开”或“关闭”),并考虑从功能得到它。

@login_required 
def topic_status(request, topic_id, status): 
    try: 
     topic = Topic.objects.get(id=topic_id, user=request.user) 
    except ObjectDoesNotExist: 
     return HttpResponseRedirect('/error/') 
    topic.status = status 
    topic.status_date = datetime.now() 
    topic.save() 
    return HttpResponseRedirect(reverse('mainpage')) 

但是,当我设置topic.status价值,这是我从URL接受,我有这样的错误(topic.status =状态):

Exception Value: invalid literal for int() with base 10: 'close' 

回答

1

那是因为你的状态字段是SmallIntegerField - 它期望一个整数,而不是一个字符串。

您的有效选择是01(虽然在您的示例中没有强制执行)。
您的前端应该显示人类可读的值并提交机器值。

你可以交替串到你的整数与字典映射:

STATUS_CHOICES_BY_VALUE = dict(((y, x) for x, y in STATUS_CHOICES)) 
topic.status = STATUS_CHOIES_BY_VALUE[status] 

有你在URL中传递这些数据,而不是说一个POST请求的原因吗?

+0

>>是否有任何理由你在URL中传递这些数据而不是说POST请求?我想通过链接设置这个参数 – tony 2011-04-24 22:54:19