基于类视图的django初始化形式选择

dpw*_*ell 6 forms django class-based-views

我已经看到很多关于如何在不使用基于类的视图时解决这个问题的答案.是否有一些非常明显的事情我错过了用CBV做的事情?

基本上我想在我的表单中有一个MultipleChoiceField,它的选择取决于视图中发生的事情.例如,我使用URL中的PK来执行一些后端请求,然后应该使用这些请求来填充选项.

# forms.py
from django.forms import Form, MultipleChoiceField, CharField

class EmailForm(Form):

    users = MultipleChoiceField(required=False)
    subject = CharField(max_length=100)
    message = CharField()

    def __init__(self, users=None, *args, **kwargs):
        super(EmailForm, self).__init__(*args, **kwargs)
        if users:
            self.fields['users'].choices = users

#urls.py
from django.conf.urls import url, patterns
from .views import EmailView

# url patterns
urlpatterns = patterns('',
    url( r'^(?P<pk>\d+)$', EmailView.as_view(), name="maindex" ),
)

#views.py
from django.views.generic import FormView, TemplateView
from .forms import EmailForm

class EmailView(FormView):
    template_name = 'myapp/email.html'
    form_class = EmailForm
    success_ulr = '/thanks/'

    def form_valid(self, form):
        # Do stuff here
        return super(EmailView, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)

基本上它归结为从视图中调用init函数的方式/位置.我怎么做?还是有另外一种我错过的方式?我想get_form_kwargs在视图中覆盖,但无法做到这一点.

谢谢

cli*_*ime 15

风景:

from django.views.generic import FormView

class EmailView(FormView):
    # ...

    def get_form_kwargs(self):
        kwargs = super(EmailView, self).get_form_kwargs()

        # get users, note: you can access request using: self.request

        kwargs['users'] = users
        return kwargs
Run Code Online (Sandbox Code Playgroud)

表格:

from django import forms import Form

class EmailForm(Form):

    users = MultipleChoiceField(required=False)
    # ...

    def __init__(self, *args, **kwargs):
        self.users = kwargs.pop('users', None)
        super(EmailForm, self).__init__(*args, **kwargs) 
        self.fields['users'].choices = self.users
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这清除了它.我现在明白了.我几乎尝试过这个,但是在__init__中遇到意外的关键字参数时出现了错误.因此弹出它是完全合理的,现在我理解它稍微好一些,我意识到可能最简单的方法是在__init__中有一个名为`users`的参数:`def __init __(self,users = None,*args,**kwargs)` (2认同)