You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django登录后根据用户Blogger实例状态动态显示创建/更新链接

解决方案

方法一:使用模板过滤器(快速实现)

1. 创建模板过滤器

在你的Django应用下新建templatetags文件夹(需包含空的__init__.py文件),然后创建blog_tags.py文件:

from django import template
from .models import Blogger

register = template.Library()

@register.filter(name='has_blogger')
def has_blogger(user):
    # 检查当前用户是否关联了Blogger实例
    return Blogger.objects.filter(user=user).exists()

2. 在模板中使用过滤器

在你的基础模板(比如base_generic.html)中加载过滤器,修改侧边栏的逻辑:

{% load blog_tags %}

{% if user.is_authenticated %}
    <li>User: {{ user.get_username }}</li>
    {% if user|has_blogger %}
        <li><a href="{% url 'blogger-update' user.blogger.id %}">编辑个人简介</a></li>
    {% else %}
        <li><a href="{% url 'blogger-create' %}">添加个人简介</a></li>
    {% endif %}
{% endif %}

方法二:全局上下文处理器(所有模板通用)

1. 创建上下文处理器

在应用下新建context_processors.py文件:

from .models import Blogger

def blogger_status(request):
    has_blogger = False
    if request.user.is_authenticated:
        has_blogger = Blogger.objects.filter(user=request.user).exists()
    return {'has_blogger': has_blogger}

2. 配置上下文处理器

在项目的settings.py中,找到TEMPLATES配置,将自定义处理器添加到context_processors列表:

TEMPLATES = [
    {
        # ... 其他配置项
        'OPTIONS': {
            'context_processors': [
                # ... 默认的上下文处理器
                '你的应用名称.context_processors.blogger_status',
            ],
        },
    },
]

3. 模板中直接使用变量

无需加载过滤器,直接在模板中判断:

{% if user.is_authenticated %}
    <li>User: {{ user.get_username }}</li>
    {% if has_blogger %}
        <li><a href="{% url 'blogger-update' user.blogger.id %}">编辑个人简介</a></li>
    {% else %}
        <li><a href="{% url 'blogger-create' %}">添加个人简介</a></li>
    {% endif %}
{% endif %}

优化视图(避免URL传ID,防止越权)

因为是一对一关联,每个用户仅对应一个Blogger实例,可修改UpdateView,无需通过URL传递ID,直接获取当前用户的实例:

from django.views.generic.edit import CreateView, UpdateView
from .models import Blogger
from django.contrib.auth.mixins import LoginRequiredMixin

class BloggerCreateView(LoginRequiredMixin, CreateView):
    model = Blogger
    fields = ['about']
    
    def form_valid(self, form):
        # 自动关联当前登录用户
        form.instance.user = self.request.user
        return super().form_valid(form)

class BloggerUpdateView(LoginRequiredMixin, UpdateView):
    model = Blogger
    fields = ['about']
    
    def get_object(self):
        # 仅返回当前用户的Blogger实例
        return Blogger.objects.get(user=self.request.user)

对应的URL配置可简化为:

from django.urls import path
from .views import BloggerCreateView, BloggerUpdateView

urlpatterns = [
    path('blogger/create/', BloggerCreateView.as_view(), name='blogger-create'),
    path('blogger/update/', BloggerUpdateView.as_view(), name='blogger-update'),
]

此时模板中的链接可以去掉ID参数:

{% if has_blogger %}
    <li><a href="{% url 'blogger-update' %}">编辑个人简介</a></li>
{% else %}
    <li><a href="{% url 'blogger-create' %}">添加个人简介</a></li>
{% endif %}

内容的提问来源于stack exchange,提问作者sourabh dhingra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:50:19