2017-09-30 43 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,它按照我希望的方式进行操作,将一列书籍加载到我的模型选项字段中。这工作正常。但是,当我尝试在模型选项字段中选择其中一个条目时,似乎无法显示单个记录。我快到了... –