【发布时间】:2013-12-03 15:57:39
【问题描述】:
我已经看到很多关于在不使用基于类的视图时如何解决此问题的答案。在使用 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)
基本上,它归结为如何/在何处从视图中调用 init 函数。我怎么做?还是我错过了另一种方式?我想在视图中覆盖get_form_kwargs,但无法做到这一点。
谢谢
【问题讨论】:
标签: django forms django-class-based-views