【问题标题】:django form constructor not returning fields?django 表单构造函数不返回字段?
【发布时间】:2013-07-05 19:13:40
【问题描述】:

由于某种原因,我无法像过去那样填充表单的字段。以下是相关位:

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')]

但是当我在views.selectEvent 中得到返回的qform 时,它的fieldsbase_fields 变量都是空字典?为什么会这样?

【问题讨论】:

    标签: django forms django-forms


    【解决方案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
    

    【讨论】:

    • 谢谢丹尼尔,我可以说我在玩元位(:但是你的self.fields['event'].choices = elist 抛出一个关于event 的KeyError,我是否把event = forms.ChoiceField() 放在这之前?跨度>
    • 要清楚,如果我将您的 event = forms.ChoiceField() 行放在 def __init__ 之前或之后,我会得到相同的空字段列表行为。
    • 丹尼尔,您的解决方案有效!我描述的“空字段”行为原来是不同的错误的结果。谢谢!
    猜你喜欢
    • 2011-03-21
    • 2011-08-20
    • 2012-08-07
    • 2013-10-03
    • 2011-03-03
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多