如何在每个页面上显示当前用户创建的类别用户

时间:2016-03-14 04:30:35

标签: python django

标题表示我试图在每个页面上发送当前用户创建的类别用户的名称。我最初的尝试只是

{% if user.is_authenticated == category.author %}
  {{category.name}}
 {% endif %}

但是这只显示某个页面中的类别,而我想在导航栏中显示它,我将它包含在每个页面中。所以我认为我应该在我的用户模型中做category = models.foreignkey('category')但是告诉我应该在模板上下文处理器中设置一个查询集。我不确定这是最好的方法。 有人可以指导我如何做这件事吗?

这是我的代码

class Category(models.Model): 
        name = models.CharField(max_length=128, unique=True)
        description = models.TextField()
        author = models.ForeignKey(settings.AUTH_USER_MODEL)

和我的views.py

@login_required
def add_category(request):
    if not request.user.is_superuser and Category.objects.filter(author=request.user).exists():
        return render(request,'main/category_already_exists.html')
    if request.method == 'POST':
        category = Category(author=request.user)
        form = CategoryForm(request.POST, request.FILES, instance=category)
        if form.is_valid():
            form.save(commit=True)
            return redirect('category', category_name_url=category.name)

    else:
        form = CategoryForm()
    context = {
        "form":form
    }
    return render(request, 'main/add_category.html',context)

这是我的简化类别视图

def category(request, category_name_url):
    category_name = decode_url(category_name_url)


                category = Category.objects.get(name=category_name)

    context = {

                "category":category,



        }
    return render(request, "main/category.html", context)

这是我的用户模型     来自userena.models导入UserenaBaseProfile

class MyProfile(UserenaBaseProfile):
    user = models.OneToOneField(User, unique=True, verbose_name=_('user'), related_name='my_profile')

2 个答案:

答案 0 :(得分:2)

也许您应该编写自己的上下文处理器并将其包含在设置中。链接到文档https://docs.djangoproject.com/en/dev/ref/templates/api/#context-processors

Django docs的定义:

“上下文处理器是接收当前HttpRequest作为参数的函数,并返回要添加到呈现上下文的数据的字典。

它们的主要用途是将所有模板共享的公共数据添加到上下文中,而不必在每个视图中重复代码。“

答案 1 :(得分:1)

您可以在request.session中添加此信息。你可以这样做:

假设您的登录视图是:

def login(request):
    # Do login stuff
    if user.is_active():
        request.session['categories'] = [ c.name for c in Category.objects.filter(author=request.user)] # add to the session 
    return redirect('/somepage')

在每个页面中显示此数据,如下所示:

{% for c in request.session.categories %}
{{ c }}
{% endfor %}

每次添加新类别时都会更新类别列表:

@login_required
def add_category(request):
    if not request.user.is_superuser and Category.objects.filter(author=request.user).exists():
        return render(request,'main/category_already_exists.html')
    if request.method == 'POST':
        category = Category(author=request.user)
        form = CategoryForm(request.POST, request.FILES, instance=category)
        if form.is_valid():
            form.save(commit=True)
            request.session['categories'] = [ c.name for c in Category.objects.filter(author=request.user)]
            return redirect('category', category_name_url=category.name)

    else:
        form = CategoryForm()
    context = {
        "form":form
    }
    return render(request, 'main/add_category.html',context)