【问题标题】:Django Forms - Specify ModelForm model at Submit?Django Forms - 在提交时指定 ModelForm 模型?
【发布时间】: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


【解决方案1】:

我肯定会尝试表单继承并执行以下操作:

class TagForm(forms.ModelForm):
    def clean():
        #...
    # whatever other methods here, etc.


class ConceptTagForm(TagForm):
    class Meta:
        model = models.Concept

class DifficultyTagForm(TagForm):
    class Meta:
        model = models.Difficulty
# etc

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2013-03-24
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多