2013-09-24 65 views
0

在我的模型有這樣一個ForeignKey關係:CreateOrUpdateView Django的模型

class Question(models.Model):  
    question = models.TextField(null=False) 

class Answer(models.Model):              
    question = models.ForeignKey(Question, related_name='answer')  
    user = models.ForeignKey(User) 
    class Meta: 
     unique_together = (("question", "user"),) 

相應的URL提交的答案中包含的問題的ID,像這樣:

url(r'^a/(?P<pk>\d+)/$', AnswerQuestion.as_view(), name='answer-question'), 

隨着用戶來自self.request.user,我試圖得到類似CreateOrUpdateView的東西,以便爲用戶和URL方案提供一些方便的導航。

直到現在我試圖與:

class AnswerQuestion(LoginRequiredMixin, CreateView): 

,並添加初始值,但就是因爲PK的不乾淨。有了UpdateView我遇到了問題,因爲我必須爲表單設置默認值。

有沒有人做過這樣的事情?我寧願避免爲同一個Answer創建和更新視圖。

回答

1

UpdateViewCreateView真的沒有什麼不同,唯一的區別是,UpdateViewself.objectself.get_object()CreateView套它None

最簡單的方法是繼承UpdateView和覆蓋get_object()

AnswerQuestionView(LoginRequiredMixin, UpdateView): 
    def get_object(queryset=None): 
     if queryset is None: 
      queryset = self.get_queryset() 

     # easy way to get the right question from the url parameters: 
     question = super(AnswerQuestionView, self).get_object(Question.objects.all()) 

     try: 
      obj = queryset.get(user=self.request.user, question=question) 
     except ObjectDoesNotExist: 
      obj = None 
     return obj 

返回正確的答案,如果它存在,None,如果它沒有。當然,添加您需要的任何屬性類,如modelform_class

+0

謝謝,這似乎工作。通過閱讀文檔,我得到的印象是「get_object」與「CreateView」的情況無關。 –

+0

與異常: 問題=超(AnswerQuestionView,個體經營).get_object(Question.objects.all()) 這是行不通的,因爲我希望創建/更新對象回答 –

+0

這就是爲什麼你」重新設定'UpdateView'的子類,就像使用'get_object'一樣。您需要使用網址中指定的ID來更新正確答案或創建新答案。通過查詢問題來調用'super'只是一個小技巧,可以輕鬆獲得正確的問題。 get'和'post'方法調用的'get_object'方法返回的實際對象本身就是一個答案,如果它不存在,則爲'None'。 – knbk