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

2024-04-20 06:05:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但这只会在某个页面中显示类别,而我想在navbar中显示它,我将它包含在每个页面中。所以我想我应该在我的用户模型中做category = models.foreignkey('category'),但是被告知我应该在模板上下文处理器中设置一个queryset。我不确定这是不是最好的办法。 有人能告诉我怎么做这件事吗?你知道吗

这是我的密码

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

在我的心里视图.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)

这是我的用户模型 从用户模型导入UserEnableBaseProfile

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

Tags: 用户nameformurlreturnifismodels
2条回答

您可以在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)

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

Django文件的定义:

“上下文处理器是接收当前HttpRequest作为参数并返回要添加到呈现上下文的数据dict的函数。你知道吗

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

相关问题 更多 >