Django 模型的形式
我有不同的型号:Django 模型的形式,django,Django,我有不同的型号: Cars Pictures (models.ForeignKey(Cars)) CarsOptions(models.OneToOneField(Cars)) 然后我想,用户可以添加新车。Forms.py: class NewCarsForm(ModelForm): class Meta: model = Cars exclude = ('checked','user') 在views.py中: @login_required def
Cars
Pictures (models.ForeignKey(Cars))
CarsOptions(models.OneToOneField(Cars))
然后我想,用户可以添加新车。Forms.py:
class NewCarsForm(ModelForm):
class Meta:
model = Cars
exclude = ('checked','user')
在views.py中:
@login_required
def add_car(request):
form = NewCarsForm(request.POST or None)
if form.is_valid():
cmodel = form.save()
cmodel.save()
return redirect(profile)
return render(request, 'add_car.html', { 'form': form,})
我有几个问题(是的,我读过)
exclude=('checked','user')
,这意味着,我希望使用checked=0创建所有新位置,以便对它们进行筛选。用户字段-用户不能在列表中选择用户。如何在表单.save()中获取用户id(谁添加了汽车)李>
谢谢
更新:
class Pictures(models.Model):
cars = models.ForeignKey(Cars, related_name='pictures')
width = models.PositiveIntegerField(editable=False, default=640)
height = models.PositiveIntegerField(editable=False, default=480)
image = models.ImageField(upload_to=lambda inst, fname: 'users_img/' + 'cars' + fname, height_field='height', width_field='width', max_length=100)
def __unicode__(self):
return str(self.id)
forms.py
class NewCarsForm(ModelForm):
class Meta:
model = Cars
exclude = ('checked','user')
PicturesFormset = inlineformset_factory(Cars, Pictures,
fields=('field_name', 'field_name'), can_delete=True)
CarsOptionsFormset = inlineformset_factory(Cars, CarsOptions,
fields=('field_name', 'field_name'), can_delete=True)
@login_required
def add_car(request):
cars = Cars(user=request.user)
if request.method == 'POST':
form = NewCarsForm(request.POST, instance=cars)
if form.is_valid():
cmodel = form.save()
picture_formset = PicturesFormset(request.POST, request.FILES,
instance=cmodel)
if picture_formset.is_valid():
picture_formset.save()
option_formset = CarsOptionsFormset(request.POST, instance=cmodel)
if option_formset.is_valid():
option_formset.save()
return redirect(profile)
form = NewCarsForm()
picture_formset = PicturesFormset(instance=Cars())
option_formset = CarsOptionsFormset(instance=Cars())
return render(request, 'add_car.html', {
'form': form,
'picture_formset': picture_formset,
'option_formset': option_formset,
})
视图.py
class NewCarsForm(ModelForm):
class Meta:
model = Cars
exclude = ('checked','user')
PicturesFormset = inlineformset_factory(Cars, Pictures,
fields=('field_name', 'field_name'), can_delete=True)
CarsOptionsFormset = inlineformset_factory(Cars, CarsOptions,
fields=('field_name', 'field_name'), can_delete=True)
@login_required
def add_car(request):
cars = Cars(user=request.user)
if request.method == 'POST':
form = NewCarsForm(request.POST, instance=cars)
if form.is_valid():
cmodel = form.save()
picture_formset = PicturesFormset(request.POST, request.FILES,
instance=cmodel)
if picture_formset.is_valid():
picture_formset.save()
option_formset = CarsOptionsFormset(request.POST, instance=cmodel)
if option_formset.is_valid():
option_formset.save()
return redirect(profile)
form = NewCarsForm()
picture_formset = PicturesFormset(instance=Cars())
option_formset = CarsOptionsFormset(instance=Cars())
return render(request, 'add_car.html', {
'form': form,
'picture_formset': picture_formset,
'option_formset': option_formset,
})
模板
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<h4>Car:</h4>
{{ form.as_p }}
<h4>Picture:</h4>
{{ picture_formset.as_p }}
<h4>Options:</h4>
{{ option_formset.as_p }}
<input type="submit" value="Submit">
</form>
{%csrf_令牌%}
汽车:
{{form.as_p}}
图片:
{{picture\u formset.as\u p}
选项:
{{option_formset.as_p}
1。这是3种不同的模型形式。如果3个模型之间有永久的一对一关系,为什么不将它们合并到1个模型中?不是3个,1个模型与1 2 1不清楚您是指您想要的单个Django表单还是指单个html表单?使用内联表单集,获得用户很容易。如果没有人回答这个问题,我会稍后再回答。IntegrityError:(1062,“重复输入'1'用于密钥'user\u id'”)
remove option\u formset…尝试仅保存汽车和图片,我们将看到该错误是否会再次显示。一个接一个地测试它,这样你就会知道问题的根源。这样,调试和修复问题就很容易了。我一个一个删除,所以我只有汽车,但错误是一样的。将其更改为ForeignKey以允许用户输入其他数据。OneToOneField只允许每个用户保存一个数据。因为您忘记将enctype=“multipart/form data”
放入模板表单中