说我有下一个型号:
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'
答案 0 :(得分:1)
那是因为你的状态字段是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请求?