将其他表单字段从HTML传递到Django中查看

时间:2018-05-17 21:24:47

标签: django django-forms django-templates

我正在关注post,当我尝试解决我的解决方案但它并不适合我。

我的问题:

我有Django Model对象,有4个属性。

我们说我有类似的东西

class MyModel(models.Model):
    user = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    first_at = models.IntegerField()
    second_at = models.IntegerField()
    third = models.TextField()

然后我有一些观点,我想用这个对象呈现表单。但是,我希望用户只插入其中的2个user,并且需要自动填充third参数;来自当前用户的user和来自其他HTML元素的third(填写表单的行)。

class HomePage(LoginRequiredMixin, generic.CreateView):
    template_name = 'index.html'
    model = MyModel
    fields = ('first', 'second')
    success_url = reverse_lazy('home')

def form_valid(self, form):
    self.object = form.save(commit=False)
    self.object.user = self.request.user
    self.object.save()
    return super().form_valid(form)

然后我创建了HTML

    <form action="." method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="hidden" name="third" value="{{ item.third }}" />
        <input type="submit" value="submit" />
    </form>

有谁知道为什么这不起作用?或者我应该如何使它工作?有更好的方法吗?

马尔科

2 个答案:

答案 0 :(得分:0)

您可以尝试这种方法

在forms.py下创建自定义表单,并排除字段,例如

class UserForm(forms.ModelForm):
     class Meta:
          model=Mymodel
          exclude = ['user','third']

并在您的创建视图中导入已创建的表单recenlty,并使用 form_clas

将其用于CreateView
class HomePage(LoginRequiredMixin, generic.CreateView):
    form_class = UserForm
    template_name = 'index.html'
    model = MyModel
    fields = ('first', 'second')
    success_url = reverse_lazy('home')

答案 1 :(得分:0)

我找到了解决方案,

问题是,当您使用generic.CreateView并设置字段或form_class时,此类只会读取这些字段。即使您手动添加其他输入字段,它也不会在类内传递。

为了解决这个问题,我创建了带隐藏字段的表单类。

class MyForm(forms.ModelForm):

    class Meta:
        model = models.OrderDetail
        fields = ('first', 'second', 'third')
        widgets = {
            'third' : forms.HiddenInput(),
        }

然后我将此表单用作普通的内部视图类

class HomePage(LoginRequiredMixin, generic.CreateView):
    template_name = 'index.html'
    model = MyModel
    form_class = forms.MyForm
    success_url = reverse_lazy('home')

然后在HTML文件中添加其他隐藏字段

<form action="." method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="hidden" name="third" value="someValue" />
        <button type="submit" name="_submit" class="btn btn-raised btn-primary">Submit</button>
</form>

这样,您可以使用自定义字段替换form.as_p附带的隐藏字段。

注意: 真正取代字段。如果您检查代码,您将看到,您将有2个隐藏字段,但只有一个有值。但由于两者都是隐藏的,没有人可以为另一个人增加价值,因此行为与该字段将被替换的行为相同。