Django начальное значение choicefield - PullRequest
4 голосов
/ 24 октября 2011

У меня странная проблема, когда я не могу установить начальное значение одного из полей в моих формах в django.

Поле моей модели:

section = models.CharField(max_length=255, choices=(('Application', 'Application'),('Properly Made', 'Properly Made'), ('Changes Application', 'Changes Application'), ('Changes Approval', 'Changes Approval'), ('Changes Withdrawal', 'Changes Withdrawal'), ('Changes Extension', 'Changes Extension')))

Код моей формы:

class FeeChargeForm(forms.ModelForm):
    class Meta:
        model = FeeCharge
        # exclude = [] # uncomment this line and specify any field to exclude it from the form

    def __init__(self, *args, **kwargs):
        super(FeeChargeForm, self).__init__(*args, **kwargs)
        self.fields['received_date'] = forms.DateField(('%d/%m/%Y',), widget=forms.DateTimeInput(format='%d/%m/%Y', attrs={'class': 'date'}))
        self.fields['comments'].widget.attrs['class']='html'
        self.fields['infrastructure_comments'].widget.attrs['class']='html'

Мой код просмотра:

form = FeeChargeForm(request.POST or None)
form.fields['section'].initial = section

Где section - это URL-переменная, переданная в функцию. Я пробовал:

form.fields['section'].initial = [(section,section)]

Без удачи :(

Есть идеи, что я делаю не так или есть лучший способ установить значение по умолчанию (перед отправкой формы) этого поля выбора из URL-адреса?

Заранее спасибо!

Обновление: Похоже, что-то связано с переменной URL. Если я использую:

form.fields['section'].initial = "Changes Approval"

Работает np .. Если я HttpResponse (раздел), он выводит правильно, хотя.

Ответы [ 2 ]

2 голосов
/ 29 января 2014

Проблема заключается в использовании request.POST и initial = {'section': section_instance.id}) вместе.Это происходит потому, что значения request.POST всегда переопределяют значения параметра «initial», поэтому мы должны поместить его отдельно.Мое решение состояло в том, чтобы использовать этот путь.

В views.py:

if request.method == "POST":
    form=FeeChargeForm(request.POST) 
else:
    form=FeeChargeForm() 

В forms.py:

class FeeChargeForm(ModelForm):
    section_instance = ... #get instance desired from Model
    name= ModelChoiceField(queryset=OtherModel.objects.all(), initial={'section': section_instance.id})

--------- или ----------

В views.py:

if request.method == "POST":
    form=FeeChargeForm(request.POST) 
else:
    section_instance = ... #get instance desired from Model
    form=FeeChargeForm(initial={'section': section_instance.id}) 

В forms.py:

class FeeChargeForm(ModelForm):
    name= ModelChoiceField(queryset=OtherModel.objects.all())
0 голосов
/ 24 октября 2011

ОБНОВЛЕНИЕ Попытайтесь избежать своего URL.Следующий ответ и статья SO должны быть полезны:

Как кодировать параметры URL в Python в процентах?

http://www.saltycrane.com/blog/2008/10/how-escape-percent-encode-url-python/

Попробуйте установитьНачальное значение для этого поля приведено ниже, и посмотрите, работает ли оно:

form = FeeChargeForm(initial={'section': section})

Я предполагаю, что вы будете делать много других вещей, когда пользователь публикует форму, поэтому вы можете отделить форму POSTиз стандартной формы, используя что-то вроде:

if request.method == 'POST':
    form = FeeChargeForm(request.POST)
form = FeeChargeForm(initial={'section': section})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...