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”
    放入模板表单中