我正试图在“微博”最小应用程序中保存100个字符。 我的代码似乎没有任何错误,但不起作用。 错误是在views.py中,我无法将外键保存到用户表。
models.py
看起来像这样:
class NewManager(models.Manager):
def create_post(self, post, username):
new = self.model(post=post, created_by=username)
new.save()
return new
class New(models.Model):
post = models.CharField(max_length=120)
date = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(User, blank=True)
objects = NewManager()
class NewForm(ModelForm):
class Meta:
model = New
fields = ['post']
# widgets = {'post': Textarea(attrs={'cols': 80, 'rows': 20})
def save_new(request):
if request.method == 'POST':
created_by = User.objects.get(created_by = user)
date = request.POST.get('date', '')
post = request.POST.get('post', '')
new_obj = New(post=post, date=date, created_by=created_by)
new_obj.save()
return HttpResponseRedirect('/')
else:
form = NewForm()
return render_to_response('news/new_form.html', {'form': form},context_instance=RequestContext(request))
我没有在这里提到进口 - 无论如何,他们做得对。 我的错误在于views.py。当我试图保存它时说:
在赋值之前引用的局部变量'created_by'
如果我将created_py
作为参数,则保存需要更多参数。这真的很奇怪。
答案 0 :(得分:7)
您没有显示完整的追溯,这有助于准确追踪错误发生的位置。 (我怀疑这不是您正在运行的确切代码,或者不是实际的错误消息,因为当rebus提到错误与代码不匹配时。)
然而,有几个指针。首先,您似乎没有使用该表单进行保存。如果你这样做,你可能不会看到这个错误。您应该使用request.POST
实例化表单,而不是从请求中手动获取值,然后保存它。此外,在尝试使用其值之前,您不会检查表单是否实际有效。这是你应该做的:
if request.method == 'POST':
form = NewForm(request.POST)
if form.is_valid():
new_obj = form.save(commit=False)
new_obj.created_by = request.user
new_obj.save()
return HttpResponseRedirect('/')
else:
form = NewForm()
return render_to_response('news/new_form.html', {'form': form},
context_instance=RequestContext(request))
另外,请注意您的经理完全不相关 - 默认经理已经定义了create
方法,该方法与您的方法完全相同。