2010-05-16 117 views
5

我试图在“微博”最小应用程序中保存100个字符的用户表单。 我的代码似乎没有任何mystakes,但不起作用。 错误是在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_py作为参数赋值

之前引用

局部变量“CREATED_BY”,保存需要更多的参数。这真的很奇怪。

+0

按四个空格缩进代码(或选择它并按Ctrl + K)。 – 2010-05-16 11:17:39

+0

我对此感到困惑:'created_by = User.objects.get(created_by = user)',你确定'User'模型有'created_by'列吗?但是,这应该会失败,但是会出现'FieldError'。还有完整的回溯将是有益的。 – 2010-05-16 11:59:13

回答

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方法,这不正是你的一样。

+0

非常感谢!它的工作原理就像它应该:) – dana 2010-05-16 13:19:43

+0

:)是的。现在我看到了复选标记,并理解其含义:)我已经检查过,谢谢你告诉我:) – dana 2010-05-23 19:29:43

相关问题