Как создать пользовательскую запись типа «список» для запроса. - PullRequest
0 голосов
/ 22 июня 2009

В основном у меня есть модель с полем ManyToMany, а затем форма модели, полученная из этой модели, где это поле отображается как поле выбора «множественный выбор». В моем шаблоне у меня пропущено это поле, вместо этого я предпочел подготовить значения для этого поля в представлении, затем передать эти подготовленные значения в request.POST (на самом деле это копия request.POST, потому что request.POST является неизменяемым), затем запрос на подачу. Отправьте в форму, а затем продолжить как обычно. Я не могу понять, как это сделать, потому что request.POST - это не просто словарь Python, а QueryDict, который ведет себя немного по-другому.

Поле, которое мне нужно заполнить, называется "not_bases". Когда я создаю виджет с помощью формы, он прекрасно работает внутри, но не в моем вкусе. Когда я проверяю значение POST, отправленное django-формой через удобное окно отладочной ошибки django, рабочий QueryDict выглядит так:

<QueryDict: {u'not_bases': [u'005', u'00AR', u'00F', u'00FD'], [...] }>

Кажется, значение для "not_bases" - это список, но это не просто список. Я не могу просто .append () к нему, потому что он не будет работать. Я покопался в документации и нашел .update (), который выглядит как , но не работает. Вот мой код:

newPOST = request.POST.copy()
for base in bases:
    newPOST.update({"not_bases": base.identifier})

и вот вывод:

<QueryDict: {u'not_bases': [u'KMER', u'KYIP'], u'reference': [u''], [...] }>

Но когда я передаю этот QueryDict в форму, я получаю ошибку проверки формы, которая говорит: «not_bases: введите список значений». Очевидно, что выглядящие списками объекты, представленные в str () представления QueryDict, не одинаковы в двух приведенных выше случаях, даже если они выглядят совершенно одинаково

Так как мне это сделать?

1 Ответ

2 голосов
/ 22 июня 2009

Не совсем понятно, что вы пытаетесь сделать здесь, но я сомневаюсь, что взлом QueryDict - верный способ добиться этого.

Если вы пытаетесь настроить отображение поля not_bases, вы можете просто переопределить определение в объявлении модели:

class MyModelForm(forms.ModelForm):
    not_bases = forms.ChoiceField(choices=[(base, base) for base in bases])

    class Meta:
         model = MyModel

Или, если вы просто хотите избежать отображения его в форме, вы можете исключить его из формы и установить значение после проверки.

class MyModelForm(forms.ModelForm):

    class Meta:
         model = MyModel
         exclude = ['not_bases']


....
if request.POST:
     if form.is_valid():
         instance = form.save(commit=False)
         instance.not_bases = bases
         instance.save()

Любой из них делает то, что вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...