Установить значение в поле с ВАРИАНТАМИ

#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? Я хочу установить этот параметр по ссылке