2015-01-16 3 views
0

Я хотел бы вернуться к записи, связанной с пользователем. Кто-нибудь может мне помочь?Django DetailView + показать соответствующую запись другой модели

часть моего зрения

class UserProfileDetailView(DetailView): 
    model = get_user_model() 
    slug_field = "username" 
    template_name = "perfil.html" 

    def get_object(self, queryset=None): 
     user = super(UserProfileDetailView, self).get_object(queryset) 
     UserProfile.objects.get_or_create(user=user) 
     return user 


Something like a old way> 
def my_view(request, slug): 
    var = get_object_or_404(Model, slug=slug) 
    xxx = AnotherModel.objects.filter(var=var) 
... 

как я могу perfome это первый вид UserProfileDetailView, связанные данные показывают?

ответ

2

Что я делаю в этом случае, это добавить связанный объект в данные контекста. Было бы что-то вроде этого:

class UserProfileDetailView(DetailView): 
    model = get_user_model() 
    slug_field = "username" 
    template_name = "perfil.html" 

    def get_context_data(self, **kwargs): 
     # xxx will be available in the template as the related objects 
     context = super(UserProfileDetailView, self).get_context_data(**kwargs) 
     context['xxx'] = AnotherModel.objects.filter(var=self.get_object()) 
     return context 
0

Другой подход заключается в расширении DetailView с MultipleObjectMixin, как в этом примере:

from django.views.generic import DetailView 
from django.views.generic.list import MultipleObjectMixin 
from django.contrib.auth import get_user_model 

class DetailListView(MultipleObjectMixin, DetailView): 
    related_model_name = None 

    def get_queryset(self): 
     # a bit of safety checks 
     if not hasattr(self, "related_model_name"): 
      raise AttributeError(
       "%s.related_model_name is missing." % ( 
        self.__class__.__name,)) 
     if not self.related_object_name: 
      raise NotImplementedError(
       "%s.related_model_name must not be None." % ( 
        self.__class__.__name,)) 
     # get the object 
     obj = self.get_object() 
     # get the related model attached to the object 
     related_model = getattr(obj, "%s_set" % self.related_model_name, None) 
     # safety check if related model doesn't exist 
     if not related_model: 
      raise AttributeError(
       "%s instance has no attribute \"%s_set\"" % (
        obj.__class__.__name__, self.related_model_name) 
     # return the related model queryset 
     return related_model.all() 

    def get(self, request, *args, **kwargs): 
     self.object_list = self.get_queryset() 
     return super(DetailListView, self).get(request, *args, **kwargs) 

class UserProfileDetailView(DetailListView): 
    template_name = "perfil.html" 
    model = get_user_model() 
    slug_field = "username" 
    related_model_name = "anothermodel" 

    def get_object(self, queryset=None): 
     user = super(UserProfileDetailView, self).get_object(queryset) 
     UserProfile.objects.get_or_create(user=user) 
     return user 

На мой взгляд, такой подход является менее чистым и понятным, но имеет огромное преимущество в повторном использовании. Это определенно имеет один недостаток: если вы используете переменную класса context_object_name, она будет ссылаться на список связанных объектов, а не на сам объект (это связано с тем, как цепочка наследования настраивается при построении класса).

Смежные вопросы