【问题标题】:Django: Add Queryset to App View with RequestDjango:使用请求将查询集添加到应用程序视图
【发布时间】:2013-07-13 19:36:38
【问题描述】:

这是我的other question 的延续,关于如何在应用程序 (Userena) 视图中包含额外的查询集(带有请求)。如果我按照@limelights 的建议做,我的代码就是这样的:

查看:

from django.views.generic import list_detail

def requestuserswampers(request):
     qs = Thing.objects.filter(user=request.user)
     return list_detail.object_list(
                 request,
                 queryset = Thing.objects.all(),
                 template_object_name = 'thing',
                 extra_context = {'swamp_things': qs},
     )

网址:

url(r'^accounts/(?P<username>(?!signout|signup|signin)[\.\w-]+)/$',
       requestuserswampers,
       name='userena_profile_detail'),

这会生成TemplateDoesNotExist 错误:Template does not exist at myapp/swamp_things.html

另一方面,如果我尝试使用 template_name = 'userena/profile_detail.html' 包含模板名称和位置,则会呈现正确的模板,但现在缺少一些上下文,例如通常在默认 userena 中呈现的用户信息“profile_detail”模板..

如何向允许请求的 Userena 配置文件详细信息视图添加额外的查询集,以便我可以根据登录用户过滤对象?感谢您的想法!

【问题讨论】:

  • 嘿!如果您在使用这种方法时遇到很多问题,我建议您将视图函数重写为适当的函数,因为我认为这将是最好的! :) 不过,如果其他人还没有的话,我明天回家时会帮助你! :)
  • 谢谢@limelights。非常感谢您的帮助!

标签: django view filtering django-queryset


【解决方案1】:

我没有意识到重写另一个应用程序的视图是公认的做法,认为这与 DRY 原则背道而驰。但是由于我还没有发现另一种方法来实现我需要做的事情,并且因为它得到了上述 cmets 中另一个高级用户的认可,所以我继续尝试重写 Userena 视图。只需要将我的查询集添加到extra_context

def profile_detail(request, username,
    template_name=userena_settings.USERENA_PROFILE_DETAIL_TEMPLATE,
    extra_context=None, **kwargs):

    user = get_object_or_404(get_user_model(),
                         username__iexact=username)

    profile_model = get_profile_model()
    try:
        profile = user.get_profile()
    except profile_model.DoesNotExist:
        profile = profile_model.objects.create(user=user)

    if not profile.can_view_profile(request.user):
        return HttpResponseForbidden(_("You don't have permission to view this profile."))
    if not extra_context: extra_context = dict()
    extra_context['profile'] = user.get_profile()
    extra_context['hide_email'] = userena_settings.USERENA_HIDE_EMAIL

        #### Added the line below
    extra_context['swamp_things'] = Thing.objects.filter(user=user) 

    return ExtraContextTemplateView.as_view(template_name=template_name,
                                            extra_context=extra_context)(request)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2012-05-19
    • 2018-03-10
    • 2017-04-17
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    相关资源
    最近更新 更多