В models.py
class Recipes(models.Model):
name = models.CharField(max_length=200)
autor = models.ForeignKey(User)
date = models.DateTimeField(auto_now=True)
text = models.TextField(max_length=5000)
class Products(models.Model):
name = models.CharField(max_length=200)
text = models.TextField(max_length=5000)
def __unicode__(self):
return self.name
class ProductsInRecipes(models.Model):
product = models.ForeignKey(Products)
recipe = models.ForeignKey(Recipes)
weight = models.PositiveIntegerField(
validators=[MaxValueValidator(10000)],
blank=False,
null=False)
В forms.py
# -*- coding: utf-8 -*-
from django import forms
from recipes.models import Recipes, ProductsInRecipes
class RecipesAddForm(forms.ModelForm):
class Meta:
model = Recipes
fields = ('name', 'text')
class ProductsInRecipesForm(forms.ModelForm):
class Meta:
model = ProductsInRecipes
fields = ('product', 'weight')
В views.py
# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response, redirect
from django.core.context_processors import csrf
from django.template import RequestContext
from django.forms.formsets import formset_factory
from recipes.forms import RecipesAddForm, ProductsInRecipesForm
def add(request):
args = {}
args.update(csrf(request))
args['form'] = RecipesAddForm()
args['form2'] = formset_factory(
ProductsInRecipesForm, extra=2, max_num=30, validate_max=True)
if request.POST:
form = RecipesAddForm(request.POST)
ProuctsFormSet = formset_factory(ProductsInRecipesForm)
form2 = ProuctsFormSet(request.POST)
args['form'] = form
args['form2'] = form2
if form.is_valid() and form2.is_valid():
recipe = form.save(commit=False)
recipe.autor = request.user
recipe.save()
form.save_m2m()
for product in form2:
product.save(commit=False)
product.recipe = recipe
product.save()
return redirect('/ok/')
return render_to_response('recipes_add.html', args, RequestContext(request))
return render_to_response('recipes_add.html', args, RequestContext(request))
И шаблон recipes_add.html
{% extends "main.html" %}
{% block content %}
{% endblock content %}
При нажатии на submit ошибка: NOT NULL constraint failed: productsInRecipes.recipe_id
Данные из form сохраняются, а из form2 соответственно нет. Как правильно сохранить form2 или что я делаю не так?
Ответ
Если всё правильно понимаю проблема вот в этом куске кода
product.save(commit=False)
куда ты сохраняешь результат? он у тебя в воздухе весит, соответственно далее ты работаешь уже не с объектом модели, а всё с той же формой:
product.recipe = recipe
product.save()
Учись правильно формировать названия переменных и не будет таких проблем:
for product_form in form2:
product = product_form.save(commit=False)
product.recipe = recipe
product.save()
Комментариев нет:
Отправить комментарий