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
相关产品推荐
相关产品推荐

