2017-09-30 127 views
0

我一直在Django的工作了約3個月,現在感覺我越來越好一點,我的工作一直到基於類的觀點。表面上看起來更清晰,更容易理解,在某些情況下,它們是。在其他人中,不是那麼多。我想通過ModelChoiceField和一個窗體使用簡單的下拉視圖。我可以爲我的views.py文件中顯示它下面用一個基於功能視圖的工作:基於Django的類視圖隨着ModelChoiceField

def book_by_name(request): 
    form = BookByName(request.POST or None) 
    if request.method == 'POST': 
     if form.is_valid(): 
      book_byname = form.cleaned_data['dropdown'] 
      return HttpResponseRedirect(book_byname.get_absolute_url1()) 
    return render(request,'library/book_list.html',{'form':form}) 

這是我在forms.py形式:

class BookByName(forms.Form): 

    dropdown = forms.ModelChoiceField(queryset=Book.objects.none()) 

    def __init__(self, *args, **kwargs): 
     super(BookByName, self).__init__(*args, **kwargs) 
     self.fields['dropdown'].widget.attrs['class'] = 'choices1' 
     self.fields['dropdown'].empty_label = '' 
     self.fields['dropdown'].queryset = Book.objects.order_by('publisher') 

此代碼的工作。當我嘗試轉換爲基於類的視圖時,這是麻煩開始的時候。我試圖做這樣的事情在views.py:

class BookByNameView(FormView, View): 
    form_class = BookByName 
    initial = { 'Book' : Book } 
    template_name = 'library/book_list.html' 

    def get(self, request, *args, **kwargs): 
     form = self.form_class(initial=self.initial) 
     return render(request, self.template_name, {'form': form}) 

    def get_success_url(self, *args): 
     return reverse_lazy('library:book_detail', args = (self.object.id,)) 

當使用這種具有相同的形式,我收到一個屬性差錯,

「BookByNameView」對象有沒有屬性「對象」。

我試過ListView以及一路上收到其他一些錯誤。該get_success_url還需要採取一個主鍵,我無法弄清楚如何獲得,表明通過了爲好。同樣,我3個月的Django的新手,所以請溫柔,在此先感謝您的想法和建議!我感覺自己在場上......只是找不到我的座位!我非常樂意以不同的方式做到這一點,如果有更清潔/更好的方式來做到這一點!

基於最新的反饋,它會出現基於搜索應該像類:

class BookNameView(FormView): 
    form_class = BookName 
    template_name = 'library/book_list.html' 

    def get_success_url(self, *args): 
     return reverse_lazy('library:book_detail') 

這是正確的嗎?我運行了這個測試版本,並回應你爲什麼我使用self.object.id的問題,我試圖從modelchoicefield中獲取pk,我正在使用它返回我想要獲取的視圖。這可能是我有點失落的地方。我試圖讓從modelchoicefield下拉列表中詳細視圖,並返回所選的書。但是,我似乎無法成功地將pk傳遞給此視圖。

我更新了我的代碼...

class BookByNameView(FormView, ListView): 
    model = Book 
    form_class = BookByName 
    template_name = 'library/book_list.html' 

    def get_success_url(self, *args): 
     return reverse_lazy('library:book_detail') 

但現在它說錯誤...反向對沒有沒找到參數「book_detail」。

回答

0

您可以在FormView中重寫form_valid()函數以實現您想要的效果。如果表單有效,則將其傳遞給form_valid()函數。

試試這個:

class BookByNameView(FormView): 
     model = Book 
     form_class = BookByName 
     template_name = 'library/book_list.html' 

     def form_valid(self, form): 
      bookbyname = form.cleaned_data['dropdown'] 
      return HttpResponseRedirect(bookbyname.get_absolute_url()) 
1

爲什麼你在那裏使用self.object?您可以在原始視圖中使用form.cleaned_data,這是你應在基於類的版本中使用什麼了。請注意,表單已傳遞到form_valid

請注意,你也做了很多其他奇怪的事情。你get方法是沒有意義的,因爲你的initial字典的定義;你應該刪除它們兩個。另外,FormView已經從View繼承,沒有必要明確地在你的聲明中使用View。

+0

感謝您抽出寶貴的時間來回答我的問題。正如我寫的,我是新手,因此我在論壇上提出了問題。你能詳細說明語法嗎? –

+0

我根據您的意見更新了代碼,這是否接近您的建議? –

+0

玩了一些之後,我更新了視圖以使用ListView,它按照我希望的方式進行操作,將一列書籍加載到我的模型選項字段中。這工作正常。但是,當我嘗試在模型選項字段中選擇其中一個條目時,似乎無法顯示單個記錄。我快到了... –