2013-10-08 23 views
0

我想製作一個表單,當前登錄的用戶可以發佈一個新的狀態。我正在使用模型表單。當我加載頁面時,我沒有收到任何錯誤,但似乎沒有數據發佈。所以我的問題是如何得到這個發佈當前用戶的新狀態?這裏是我當前的代碼:Django模型表單發佈到當前用戶

筆者認爲:

@login_required 
def post(request, username): 
    logged_user = request.user 
    newpostform = PostForm(instance=request.user.get_profile(), data=request.POST) 
    if newpostform.is_valid(): 
     newpostform.save() 
    newpostform = PostForm() 
    context = {'newpostform': newpostform,} 
    return render(request, 'twitterclone/newpost.html', context) 

我的表格:

class PostForm(ModelForm): 
    class Meta: 
     model = Post 

我的模型:

class Profile(models.Model): 
    user = models.ForeignKey(User) 
    bio = models.TextField() 
    image = models.ImageField(upload_to='images/%Y/%m/%d') 
    following = models.ManyToManyField('self', blank = True, null = True) 

    def __unicode__(self): 
     return unicode(self.user) 

class Post(models.Model): 
    profile = models.ForeignKey(Profile) 
    body = models.CharField(max_length=140) 
    pub_date = models.DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
     return unicode(self.body[:50]) 

我的模板:

<form action="" method="POST"> 
{% csrf_token %} 
{{newpostform.body}} 
<button>Tweet It</button> 
</form> 

回答

1

您的模板不包含profile字段,這是強制性的,因此您的表單永遠無效。由於您每次都創建一個新表單,因此您沒有看到錯誤消息 - 不是您的模板無論如何都會顯示它。

在你的表單定義指定您只希望身體:

class PostForm(ModelForm): 
    class Meta: 
     model = Post 
     fields = ['body'] 

,將讓表單驗證。您也將有明確地設置profile領域:

if newpostform.is_valid(): 
    newpost = newpostform.save(commit=False) 
    newpost.profile = request.user.get_profile() 
    newpost.save() 

和你instance參數的形式構造是不是做你認爲這是 - 這是傳遞模型的現有實例的形式表示編輯。

我將因此改寫的觀點:

@login_required 
def post(request, username): 
    newpostform = PostForm(data=request.POST) 
    if newpostform.is_valid(): 
     newpost = newpostform.save(commit=False) 
     newpost.profile = request.user.get_profile() 
     newpost.save()    
     newpostform = PostForm() 
    context = {'newpostform': newpostform,} 
    return render(request, 'twitterclone/newpost.html', context) 

在這裏,我不是重新分配形式,以一個新的空單,除非剛提交的一個是有效的。這將允許模板顯示錯誤消息。

相關問題