Hi, i just starting to use CBVs in django and i try to implement something like that:
from django.views.generic import DetailView from .models import Product, ProductOpinion from .forms import OpinionForm class OpinionListMixin(object): queryset = ProductOpinion.objects.all().order_by('-date') def get_context_data(self, **kwargs): context = { 'opinion_list': self.queryset } context.update(kwargs) return super(OpinionListMixin, self).get_context_data(**context) class OpinionFormMixin(object): form_class = OpinionForm def get_context_data(self, **kwargs): context = { 'form': self.form_class } context.update(kwargs) return super(OpinionFormMixin, self).get_context_data(**context) def form_valid(self, form): return super(OpinionFormMixin, self).form_valid(form) class ProductDetailsView(OpinionListMixin, OpinionFormMixin, DetailView): queryset = Product.objects.filter(status=True) template_name = "product.html" context_object_name = "product" but how to filter productopinions in OpinionListMixin by product_id and how to set product_id in OpinionFormMixin and do i need to set now success_url? W dniu środa, 29 sierpnia 2012 23:24:55 UTC+2 użytkownik Melvyn Sopacua napisał: > > On 29-8-2012 18:46, Rainy wrote: > > On Aug 29, 3:10 am, Melvyn Sopacua <m.r.sopa...@gmail.com> wrote: > >> On 29-8-2012 4:44, Rainy wrote: > >> > >>> When I use CBVs, I nearly always end up needing to mix different types > in > >>> the same view, e.g. detail view and list view, list view and modelform > >>> view, etc. I really like CBVs but I feel this is the one shortcoming > that I > >>> constantly run into that makes CBVs much less flexible and helpful > than > >>> they could be. > >> > >> What are your real world cases for this? If you combine several models > >> to make up a page, you should consider writing your own mixins that > >> inherit only from ContextMixin and implement get_context_data() to add > >> the extra information. > > <snip example> > > > I will give some examples at the end of the message, but first I want > > to expand a bit on this idea. > > > > Let's say you have a detail CBV, FooView(DetailView): model = Foo ; > > and a list view, BarView(ListView): model = Bar . > > > > Now, combining different types of views is an extremely common case > > and you might say that the cases when you don't need to do that are > > usually so simple that existing GCBVs already handle them perfectly. > > The list and detail view don't bite each other in many aspects. However, > as you will list in examples below, you usually don't have just one list > view per page. See below. > > > I don't see any apparent reason why the two examples above can't > > be combined exactly in the same way you inherit each separate view: > > FooBarView(DetailView, ListView): detail_model=Foo; list_model=Bar. > > Because how would you declare a second list model? And how would you > pick these up? Aside from making the routing through the model > difficult, this will also be a declaration nightmare. > > > As a bonus, you don't have to decide which mixin to use and when > > overriding methods, you will know which instance variable and method > > handles detail and list objects. > > Except when you need more than one list or detail or both. > > > Here are a few examples where it would be useful, and I can find many > > more in my projects: > > > > - blog post: 3 CBVs: post, list of comments, comment form > > - search: FormView, ListView > > - photo album: detail view for album, listview of images > > > > I know each of these cases can be handled with current GCBVs but > > with a lot more effort and in a more verbose and error-prone way > > than what I'm proposing. > > I don't see that: > class BlogView(CommentListMixin, CommentFormMixin, DetailView) : > model = BlogPosts > > versus: > class BlogView(DetailView, ListView, CreateView) : > detail_model = BlogPost > list_model = Comments > form_model = Comments > > I find the second version harder to read, more verbose to type and when > you want to support multiple models you will have to support some sort > of sequence or mapping. Not to mention how you'd handle template-coder > friendly names through context_object_name and similar. > > Yes, the first version requires more work to code the mixins, but I > don't find them harder to debug either. In fact, pretty much only one > point where things can go wrong: get_context_data(). > > I can see your point and some of my issues with it may well be personal > preference, but I'm not sure if the Generic CBV's are a good base for > what you ask of them. I'm currently working on a RelatedModelMixin and > subsequently a FormsetMixin and I already feel like I'm coloring outside > the lines. > It's made me consider the fact that function based views are more > natural. A view really is a process where you hand it some info and it > returns what you asked for. It's less natural to think of it as a > collection of parts (objects) in a machine that work together to produce > your result. > > However, once you know the order in which things are flowing through the > magic machine, debugging them isn't hard and things make a lot of sense > so I think part of the blame here is in the documentation which is in > fact improving a lot. > > Last but not least, I think you should start writing if you feel > confident it can be done and is an improvement. It's the best way to > find out if your ideas can work or if another approach should be sought. > > -- > Melvyn Sopacua > -- You received this message because you are subscribed to the Google Groups "Django users" group. To view this discussion on the web visit https://groups.google.com/d/msg/django-users/-/G7XaJZM0MhoJ. To post to this group, send email to django-users@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.