为什么我不能向数据库提交双重表格

时间:2019-05-24 16:19:54

标签: django python-3.x django-forms django-views

我创建了一个表单视图,当我想保存带有两个模块的表单时,看到“ IntegrityError”。请帮忙,谢谢你

class Place(models.Model):
    LocalName = models.CharField('Nazwa Lokalu', max_length=200)
    slug = models.SlugField('Link', max_length=100, default="")
    LocalImg = models.ImageField('Zdjęcie Lokalu', 
    upload_to='Place/static/locals/img', blank=True, max_length=20000)
    LocalAdress = models.CharField('Adres', max_length=500)
    LocalNumberPhone = models.CharField('Numer telefonu', max_length=9)
    LocalHours = models.TextField(verbose_name='Godziny otwarcia', 
    max_length=20000)


    def get_aboslute_url(self):
        return reverse("place:place_create", kwargs={'id': self.id})

    class Meta:
        verbose_name = "Lokal"
        verbose_name_plural = "Lokale"
    def __str__(self):
        return self.LocalName

class Menu(models.Model):
    place = models.ForeignKey(Place, on_delete=models.CASCADE, 
    related_name="place", default="")
    Dinner = models.CharField("Nazwa potrawy",blank=True, default="", 
    max_length=200)
    DinnerComponents = models.CharField("Składniki",blank=True, default="", 
    max_length=20009)
    PizzaPrice = models.CharField("Rozmiar i cena Pizzy", 
    help_text="np.Mała-10zł", default="", blank=True, max_length=300) 
    Price = models.DecimalField("Cena",default="00", max_digits=5, 
    decimal_places=2)
    class Meta:
        verbose_name = "Menu"
        verbose_name_plural = "Menu"

views.py

def create_place(request):
    form = PlaceForm()
    sub_form = MenuForm()
    if request.POST:
        form = PlaceForm(request.POST)
        sub_form = MenuForm(request.POST)

        if form.is_valid() and sub_form.is_valid():
            place = form.save(commit=False)
            place.location = sub_form.save()
            place.save()
    context = {
    'form': form,
    'sub_form': sub_form
    }
return render(request, 'posts/layout.html', context)

Forms.py

class PlaceForm(forms.ModelForm):

class Meta:
    model = Place
    fields = ('LocalName', 'LocalAdress', 'LocalNumberPhone','LocalHours',)

class MenuForm(forms.ModelForm):
    class Meta:
        model = Menu
        fields = ('Dinner','DinnerComponents','DinerCategory', 'Price',)

填写表格并单击提交后,将出现错误“ NOT NULL约束失败:posts_menu.place_id”

1 个答案:

答案 0 :(得分:1)

您必须首先保存一个位置,然后将保存的位置分配给菜单,最后保存菜单。

if form.is_valid() and sub_form.is_valid():
    place = form.save()
    menu = sub_form.save(commit=False)
    menu.place = place
    menu.save()

这是因为Menu需要一个place外键,否则无法保存。

(注意:为什么要为字段名混合使用snake_case和CamelCase?很难知道如何调用模型的属性。Python的约定是所有属性/方法/变量都使用snake_case)