假设我有下一个模型:
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
-它期望一个整数,而不是字符串。
您的有效选择是0
或1
(尽管在您的示例中没有强制执行超出类型)。
您的前端应该显示人类可读的值并提交机器值。
您也可以使用字典将字符串映射为整数:
STATUS_CHOICES_BY_VALUE = dict(((y, x) for x, y in STATUS_CHOICES))
topic.status = STATUS_CHOIES_BY_VALUE[status]
有什么原因你在URL中传递这个数据,而不是说POST请求?