2013-03-09 2 views
0

Попытка создать форму комментария следующим образом:Django: CommentForm не работает правильно, без ошибок?

class CommentCreationForm(forms.Form): 
    body = forms.CharField(widget=forms.Textarea) 
    author = forms.CharField() 

    def __init__(self, *args, **kwargs): 
     super(CommmentCreationForm, self).__init__(*args, **kwargs) 
     self.user = kwargs.pop('user', None) 

    def save(self): 
     data = self.cleaned_data 
     comment = Comment(body=data['body'], author=data['author'], user=self.user) 
     comment.save() 

    def clean(self): 
     return self.cleaned_data 

views.py

@login_required 
def create(request): 
    try: 
     if is_post(request): 
      form = CommentCreationForm(request.user) 
      if form.is_valid(): 
       print 'valid' 
       form.save() 
       return render_to_response("login.html", context_instance = RequestContext(request)) 
      return render_to_response("login.html", context_instance = RequestContext(request)) 
     return render_to_response("create.html", {'form':CommentCreationForm()}, context_instance = RequestContext(request)) 
    except Exception as e: 
     print str(e) 

Если я отправить форму, он возвращает: объект «Пользователь» не имеет атрибута «получить». Я уверен, что делаю что-то очень не так, но я не знаю, что.

+0

Я думаю, что проблема заключается в методе экономии, пытаются это так: – catherine

+1

комментарий = Комментарий (тело = данные [ «тело»], автор = данные [ 'автор '], user_id = 1). Поставьте пользователя по умолчанию, чтобы проверить, будет ли он сохранен или нет. – catherine

+2

Опубликуйте свою трассу. – thebjorn

ответ

0

Во-первых, форма неправильно инициализируется, подпись Form.__init__ выглядит следующим образом:

Form.__init__(data=None, files=None, ...) 

# When you put 
form = CommentCreationForm(request.user) 
# The data is feed w/ request.user ... 

Во-вторых, self.user = kwargs.pop('user', None) всегда устанавливается self.user в None, если код ссылающееся есть:

form = CommentCreationForm(request.POST, user=request.user) 

Наконец , лучшим подходом является ссылка request.user непосредственно, в некоторых областях, например:

def make_commment_form_cls(user): 

    class CommentCreationForm(forms.Form): 
     body = forms.CharField(widget=forms.Textarea) 
     author = forms.CharField() 

     def save(self): 
      data = self.cleaned_data 
      # HERE 
      comment = Comment(body=data['body'], author=data['author'], user=user) 
      comment.save() 

    return CommentCreationForm 

В создании вид

# replace 
form = CommentCreationForm(request.user) 
# with 
form = make_comment_form_cls(request.user)(request.POST)