2010-05-26 58 views
2

我有一個回覆類:Django的我不能保存形式2個的外鍵

class Reply(models.Model): 
    reply_to = models.ForeignKey(New) 
    creator = models.ForeignKey(User) 
    reply = models.CharField(max_length=140,blank=False) 

重播形式:

class ReplyForm(ModelForm): 
class Meta: 
     model = Reply 
     fields = ['reply'] 

,其中新的Post類(含用戶帖子) 和一個視圖

def save_reply(request): 
    #u = New.objects.get(pk=id) 
if request.method == 'POST': 

    form = ReplyForm(request.POST) 
    if form.is_valid(): 
     new_obj = form.save(commit=False) 
     new_obj.creator = request.user 
     new_obj.reply_to = form.reply_to 
    # reply_to_id = u 
     new_post = New(2) #this works hardcoded, but how can i get the blog New post #id, as a parameter, instead? 
     new_obj.reply_to = new_post 
     new_obj.save() 
     return HttpResponseRedirect('.')  

否則: 形式= ReplyForm()
選擇render_to_response回報( '回覆/ replies.html',{ '形式':形式, }, context_instance = RequestContext的(請求))

其中CREATED_BY屬於一類新的,並代表後的創建者(其將被回覆)

我該如何將當前帖子分配給它下面的回覆?

在此先感謝!

回答

2

我可能錯過了一些東西,但reply_to需要New模型的一個實例。 New.id對我來說看起來不像?

new_obj.reply_to = New.id 

您是否可以在此時指定新模型的實例?

啊,我看你已經調整了問題

如果沒有新的模型的實例,你需要創建一個

new_post = New(whatever, goes, here) 
new_post.save() 

然後給它分配到reply_to

new_obj.reply_to = new_post 

或類似。

編輯

不知道正是ReplyForm看起來像我猜了一點,但據推測它是基於Reply對象,讓用戶選擇REPLY_TO場莫名其妙地或其他?

假設形式的REPLY_TO變量填充&正確的,我認爲你應該能夠做到:

form = ReplyForm(request.POST) 
if form.is_valid(): 
    new_obj = form.save(commit=False) 
    new_obj.creator = request.user 
    new_obj.reply_to = form.reply_to 
    new_obj.save() 

事實上,因爲它是一個外鍵,該new_obj = form.save(commit=False)可能已經設置.reply_to適合你? Django Model Forms文檔可能會有所幫助。

+0

是:)它的工作原理,硬編碼我的意思是:new_obj.creator = request.user new_post =新(1) new_obj.reply_to = new_post new_obj.save() 但我不知道如何通過messageId(從新模型)到答覆。我嘗試使用\t u = New.objects.get(pk = id)和New(u),但沒有結果。 – dana 2010-05-26 23:47:20

+0

我已經編輯過我的問題:) – dana 2010-05-27 12:05:09

+0

我已編輯,添加我的ReplyForm。 它不像上面那樣工作,它說: 'ReplyForm'對象沒有屬性'reply_to' as reply_to是New的外鍵,即包含用戶帖子的表格 – dana 2010-05-27 14:19:52

1

不知道這是否適合您的應用程序,但您可以嘗試使用form widget,特別是HiddenInput之一,在表單中包含帖子(id)。喜歡的東西

class ReplyForm(ModelForm): 
    reply_to = forms.ModelChoiceField(New.objects.all(), widget=forms.HiddenField) 
    class Meta: 
     model = Reply 
     fields = ['reply', 'reply_to'] 
     widgets = { 
      'reply_to': HiddenField, 
     } 

(不知道這是完全正確的,但看到overriding-the-default-field-types-or-widgets更多)。

現在,您已經激活,您需要傳遞到客戶端,通過背部的形式ID,你現在只需要把它當你在第一時間

else: 
    form = ReplyForm() 
    form.reply_to = # ... fill in the current post (New inst) being replied to 
    # presumably from somewhere in the request object? 
    return render_to_response('replies/replies.html', { 'form': form, }, 
創建形式顯示在

希望這不會導致你在錯誤的軌道上 - 完全未經測試,E & OE,情況因人而異,等等,等等

+0

嗯...它仍然無法正常工作。 我已經在另一個問題在這裏重新配置它:http://stackoverflow.com/questions/2923607/django-blog-reply-system 謝謝:) – dana 2010-05-28 14:23:29