2013-07-05 4 views
-1

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

views.py

def selectEvent(request, user=None): 
    if not user: 
     userID = request.user.id 

    if request.method == 'POST': 
     qform = eventForm(request.POST, user=userID) 
     if qform.is_valid(): 
      qryData = qform.cleaned_data 
      event = qryData['event'] 
      qurl = '/showGG/getWedGuest/%s' % (event) 
      return HttpResponseRedirect(qurl) 
    else: 
     qform = eventForm(user=userID) 

    return render(request, 'showGG/getEvent.html', {'form': qform}) 

forms.py

class eventForm(forms.Form): 

    def __init__(self, *args, **kwargs): 
     user=kwargs.pop('user') 
     super(eventForm, self).__init__(*args, **kwargs) 
     elist = [(e,e.name) for e in Event.objects.filter(organizer_id__exact=user)] 
     print 'eventForm: elist=',elist 
     event = forms.ChoiceField(choices=elist) 

я нужен сложный eventForm.__init__() Потому что я хочу передать ему переменную, но показывает печать линии что он производит список, который я ожидаю:

eventForm: elist= [(<Event: cd2 - 2013-08-01 00:17:39+00:00>, u'cd2')] 

но когда i получить возвращенный qform назад в views.selectEvent, и его fields и base_fields переменные - это пустые словари? зачем это было?

ответ

1

Поскольку вы не указали никаких полей в форме. Вы не можете просто установить их в __init__ и надеяться, что это сработает: происходит сложный материал метакласса, и определения должны быть на уровне класса. Что вы можете сделать в __init__ это переопределить выбор существующего поля:

class eventForm(forms.Form): 
    event = forms.ChoiceField() 

    def __init__(self, *args, **kwargs): 
     user=kwargs.pop('user') 
     super(eventForm, self).__init__(*args, **kwargs) 
     elist = [(e.id,e.name) for e in Event.objects.filter(organizer_id__exact=user)] 
     self.fields['event'].choices = elist 
+0

благодаря Daniel, я мог сказать, я играл с мета-бит (:., Но ваш 'self.fields [«событие»] = выбор elist' вызывает KeyError в отношении 'event', независимо от того, поместил ли я строку' event = forms.ChoiceField() 'до этого – rikb

+0

, если я поставил вашу строку' event = forms.ChoiceField() 'перед' def __init__', или после него, я получаю такое же поведение пустых полей. – rikb

+0

Даниэль, ваше решение работает! Поведение «пустых полей», которое я описал, оказалось результатом другой ошибки. – rikb

Смежные вопросы