我正在关注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>
有谁知道为什么这不起作用?或者我应该如何使它工作?有更好的方法吗?
马尔科
答案 0 :(得分:0)
您可以尝试这种方法
在forms.py下创建自定义表单,并排除字段,例如
class UserForm(forms.ModelForm):
class Meta:
model=Mymodel
exclude = ['user','third']
并在您的创建视图中导入已创建的表单recenlty,并使用 form_clas
将其用于CreateViewclass 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个隐藏字段,但只有一个有值。但由于两者都是隐藏的,没有人可以为另一个人增加价值,因此行为与该字段将被替换的行为相同。