使用CHOICES将值设置为字段

时间:2011-04-24 22:28:30

标签: django django-models

说我有下一个型号:

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)

我尝试在网址中发送状态('打开'或'关闭')并从视图中的功能中获取。

@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'))

但是当我设置了从URL收到的topic.status值时,我有这样的错误(topic.status = status):

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

1 个答案:

答案 0 :(得分: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请求?