我希望在实际渲染之前使用上下文处理器或中间件来修改传递给render_to_response的字典的值.我有一个我正在尝试实现的消息传递模式,它将基于我想在呈现模板之前搜索上下文的用户类型的存在来填充消息列表.
例:
def myview(...):
...
return render_to_response('template.html',
{'variable': variable},
)
Run Code Online (Sandbox Code Playgroud)
并且我希望能够在"变量"存在的情况下向上下文添加其他信息.
如何在我的视图定义之后但在它到达模板之前访问"变量"以便我可以进一步修改上下文?
我正在构建Django应用程序,提交链接和投票功能.
我想显示所有链接,由用户在用户详细信息页面中投票.我可以使用以下方法在python shell中检索它们:
Link.objects.filter(votes__voter=user)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将此作为额外的上下文字段添加到视图中.以下是代码:
models.py
class Link(models.Model):
title = models.CharField(max_length=200)
submitter = models.ForeignKey(User)
submit_date = models.DateTimeField(auto_now_add=True)
up_votes = models.IntegerField(default=0, blank=True, db_index=True)
...
class UserProfile(models.Model):
user = models.OneToOneField(User, unique=True)
...
class Vote(models.Model):
voter = models.ForeignKey(User)
link = models.ForeignKey(Link, related_name='votes')
...
Run Code Online (Sandbox Code Playgroud)
views.py
class UserProfileDetailView(DetailView):
model = get_user_model()
slug_field = "username"
template_name = "user_detail.html"
def get_object(self, queryset=None):
user = super(UserProfileDetailView, self).get_object(queryset)s
UserProfile.objects.get_or_create(user=user)
return user
Run Code Online (Sandbox Code Playgroud)
user_detail.html
...
{% if object == request.user and request.user.is_authenticated %}
<p><a href='{% url "edit_profile" %}'>Edit My Profile</a></p>
{% …Run Code Online (Sandbox Code Playgroud) django django-queryset django-views django-generic-views django-context
我有一个上下文处理器返回用户朋友列表。我希望它仅在用户登录时返回朋友的字典,因为目前我有干净的数据库,没有任何用户,并且我收到错误:
Exception Type: DoesNotExist at /
Exception Value: UserProfile matching query does not exist.
这是我尝试过的两个版本,但没有成功。为什么它不应该搜索匹配的用户?
def friends_list(request):
if request.user.is_authenticated:
userprofile = UserProfile.objects.get(user=request.user)
friends = Friend.objects.filter(friend_of=userprofile)
else:
friends = {}
return {'friends': friends}
def friends_list(request):
userprofile = UserProfile.objects.get(user=request.user)
if userprofile:
friends = Friend.objects.filter(friend_of=userprofile)
else:
friends = {}
return {'friends': friends}
Run Code Online (Sandbox Code Playgroud) 在每个页面(base.html)中,我想检查request.user我的班级是否有管理员角色UserTypes并显示管理员链接.目前我这样做:
{% if user.profile.user_types.all %}
{% for user_type in user.profile.user_types.all %}
{% if user_type.name == "ad" %}
<li>
<a href="{% url admin:index %}" class="round button dark ic-settings image-left">Admin</a>
</li>
{% endif %}
{% endfor %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
user.profile只是从Django User到我的UserProfile.
但这似乎有点冗长和笨重.有更简单的方法吗?也许我应该编写自己的自定义上下文处理器并传递一个类似的变量is_admin,但我从来没有写过自定义上下文处理器...
我注意到django模板已经传递了某些变量而不必发送任何数据.例如,可以在渲染时调用"user"变量而不向模板发送任何"用户"数据.
在某处我可以找到这些"默认变量"的列表吗?