用CHOICES将value设置为字段



假设我有下一个模型:

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

但是当我设定话题时。状态值,我从URL收到,我有这样的错误(主题。状态=状态):

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

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

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

您也可以使用字典将字符串映射为整数:

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

有什么原因你在URL中传递这个数据,而不是说POST请求?

最新更新