class One(models.Model):
text=models.CharField(max_length=100)
class Two(models.Model):
test = models.Integer()
many = models.ManyToManyField(One, blank=True)
当我尝试保存我的管理面板对象,我采取的错误,如:
“‘两课’实例需要一个多到许多可用于关系之前有一个主键值“。
我使用django 1.3。我尝试添加AutoField到两个类,但它不工作。
这是我的代码。
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
from django.core.urlresolvers import reverse
from project.foo.forms import FooForm
from project.foo.models import Foo
from project.fooTwo.views import fooTwoView
def foo(request, template_name="foo_form.html"):
if request.method == 'POST':
form = FooForm(data=request.POST)
if form.is_valid():
foo = Foo()
foo.name = request.POST.get("name")
foo.count_people = request.POST.get("count_people")
foo.date_time = request.POST.get("date_time")
foo.save()
return fooTwoView(request)
else:
form = FooForm()
return render_to_response(template_name, RequestContext(request, {
"form": form,
}))
P.S.我发现我的失败。它在模型中。我在保存方法中使用了多对多。我在使用前添加检查,但这没有帮助。
class Foo(models.Model):
name = models.CharField(max_length=100, null=False, blank=False)
count_people = models.PositiveSmallIntegerField()
menu = models.ManyToManyField(Product, blank=True, null=True)
count_people = models.Integer()
full_cost = models.IntegerField(blank=True)
def save(self, *args, **kwargs):
if(hasattr(self,'menu')):
self.full_cost = self.calculate_full_cost()
super(Foo, self).save(*args, **kwargs)
def calculate_full_cost(self):
cost_from_products = sum([product.price for product in self.menu.all()])
percent = cost_from_products * 0.1
return cost_from_products + percent
我尝试破解的保存方法,如
if(hasattr(self,Two)):
self.full_cost = self.calculate_full_cost()
这是帮助我,但我不认为这是Django的方式。有趣的是,没有这个检查管理面板显示错误,但创建对象。现在,如果我从Two中选择项目并保存,我的对象没有full_cost,但是当我查看我的对象时,管理面板记住我的选择并向我显示我的两个项目,我选择了......我不知道为什么。
我该如何保存?
非常感谢。后来我改变我的代码,以正确的形式白色“自我”,但我忘了更新这篇文章。感谢您对form.cleaned_data和form.save的建议,我会用这个)我只是复制\粘贴相同的代码,并使用他*( 那么m2m。你告诉写方法,会做什么更新,保存等。你可以显示一个例子或链接,我可以阅读关于这个? m2m_changed信号怎么样 - 谢谢。也许我在我的解决方案中使用它。 –
在文档中有相当多的代码示例和解释,您应该先阅读它。 –