#django #django-models
#django #django-модели
Вопрос:
Допустим, у меня есть следующая модель:
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
— оно ожидает целое число, а не строку.
Вашими допустимыми вариантами являются 0
или 1
(хотя они не применяются за пределами типа в вашем примере).
Ваш интерфейс должен отображать значение, читаемое человеком, и отправлять машинное значение.
Вы могли бы в качестве альтернативы сопоставить строки с вашими целыми числами с помощью словаря:
STATUS_CHOICES_BY_VALUE = dict(((y, x) for x, y in STATUS_CHOICES))
topic.status = STATUS_CHOIES_BY_VALUE[status]
Есть ли какая-либо причина, по которой вы передаете эти данные в URL вместо, скажем, запроса POST?
Комментарии:
1. >> Есть ли какая-либо причина, по которой вы передаете эти данные в URL вместо, скажем, запроса POST? Я хочу установить этот параметр по ссылке