【发布时间】:2015-11-19 13:04:03
【问题描述】:
我正在创建一个表单,该表单可以根据用户从不同视图中选择的模型将数据保存到四个表之一。我不想为每个模型创建相同的表单。
有没有办法在用户点击提交时将模型名称传递给表单?
代码如下:
models.py
class TagModel(MP_Node):
slug = models.SlugField(max_length=64, blank=True)
name = models.CharField(max_length=64)
generic_objecttag_set = GenericRelation('ObjectTag')
def __str__(self):
return self.name
class Meta:
unique_together = (
('slug',),
)
abstract = True
class Concept(TagModel):
class Meta:
verbose_name = 'Concepts'
class Difficulty(TagModel):
class Meta:
verbose_name = 'Difficulty'
class QuestionType(TagModel):
class Meta:
verbose_name = 'Question Type'
class QuestionFormat(TagModel):
class Meta:
verbose_name = 'Question Format'
forms.py
class TagModelForm(forms.ModelForm):
def clean(self):
cleaned_data = super(TagModelForm, self).clean()
cleaned_data['slug'] = slugify(cleaned_data.get('name', ''))
return cleaned_data
class Meta:
model = models.TagModelForm
fields = ('slug', 'name',)
widgets = {
'slug': forms.HiddenInput(),
}
views.py
class TagCreateView(FormView):
form_class = forms.TagModelForm
template_name = 'tags/create.html'
@method_decorator(permission_required('tags.add_tag'))
def dispatch(self, request, *args, **kwargs):
arg_model = kwargs.get('tree_name', None)
if arg_model:
self.curr_model = get_model('tags', arg_model)
return super(TagCreateView, self).dispatch(request, *args, **kwargs)
def form_valid(self, form):
data = form.cleaned_data
curr_model = self.curr_model
curr_model.add_root(**data)
return super(TagCreateView, self).form_valid(form)
def get_success_url(self):
return reverse('tags:index')
【问题讨论】:
-
我不确定这是否可能。听起来最好使用表单继承。 docs.djangoproject.com/en/1.8/topics/forms/modelforms/…
-
尝试覆盖表单的
__init__方法。def __init__(self, data, *args, **kwargs): self._meta.model = <put here model from data var or where from you nee> super(TagModelForm, self).__init__(data, *args, **kwargs) -
谢谢stackoverflow.com/users/897413/der-fenix。我需要实例化表单并从视图中传递模型吗?从视图中我实际上如何做到这一点?
标签: python django django-forms django-class-based-views