- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望允许我的网站管理员在管理网站上过滤来自特定国家/地区的用户。所以自然的做法是这样的:
#admin.py
class UserAdmin(django.contrib.auth.admin.UserAdmin):
list_filter=('userprofile__country__name',)
#models.py
class UserProfile(models.Model)
...
country=models.ForeignKey('Country')
class Country(models.Model)
...
name=models.CharField(max_length=32)
但是,由于 django 中处理用户及其用户配置文件的方式,这会导致以下错误:
'UserAdmin.list_filter[0]' refers to field 'userprofile__country__name' that is missing from model 'User'
如何绕过此限制?
最佳答案
您正在寻找的是自定义管理FilterSpecs。坏消息是,对那些可能不会很快发布的支持(您可以跟踪讨论 here )。
但是,您可以以肮脏的黑客行为为代价来解决该限制。在深入研究代码之前如何构建 FilterSpecs
的一些要点:
FilterSpec
列表时,Django 使用您在 list_filter
中提供的字段列表FilterSpec
类列表,每个类都与一个 test 函数关联。list_filter
中的每个字段,Django 将使用第一个 FilterSpec
类,其中 test 函数返回 True 对于该领域。好的,现在考虑到这一点,看看下面的代码。改编自a django snippet 。代码的组织由您自行决定,只需记住这应该由 admin
应用导入。
from myapp.models import UserProfile, Country
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec
from django.utils.encoding import smart_unicode
from django.utils.translation import ugettext_lazy as _
class ProfileCountryFilterSpec(ChoicesFilterSpec):
def __init__(self, f, request, params, model, model_admin):
ChoicesFilterSpec.__init__(self, f, request, params, model, model_admin)
# The lookup string that will be added to the queryset
# by this filter
self.lookup_kwarg = 'userprofile__country__name'
# get the current filter value from GET (we will use it to know
# which filter item is selected)
self.lookup_val = request.GET.get(self.lookup_kwarg)
# Prepare the list of unique, country name, ordered alphabetically
country_qs = Country.objects.distinct().order_by('name')
self.lookup_choices = country_qs.values_list('name', flat=True)
def choices(self, cl):
# Generator that returns all the possible item in the filter
# including an 'All' item.
yield { 'selected': self.lookup_val is None,
'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
'display': _('All') }
for val in self.lookup_choices:
yield { 'selected' : smart_unicode(val) == self.lookup_val,
'query_string': cl.get_query_string({self.lookup_kwarg: val}),
'display': val }
def title(self):
# return the title displayed above your filter
return _('user\'s country')
# Here, we insert the new FilterSpec at the first position, to be sure
# it gets picked up before any other
FilterSpec.filter_specs.insert(0,
# If the field has a `profilecountry_filter` attribute set to True
# the this FilterSpec will be used
(lambda f: getattr(f, 'profilecountry_filter', False), ProfileCountryFilterSpec)
)
# Now, how to use this filter in UserAdmin,
# We have to use one of the field of User model and
# add a profilecountry_filter attribute to it.
# This field will then activate the country filter if we
# place it in `list_filter`, but we won't be able to use
# it in its own filter anymore.
User._meta.get_field('email').profilecountry_filter = True
class MyUserAdmin(UserAdmin):
list_filter = ('email',) + UserAdmin.list_filter
# register the new UserAdmin
from django.contrib.admin import site
site.unregister(User)
site.register(User, MyUserAdmin)
这显然不是万能药,但它会完成这项工作,等待更好的解决方案出现。(例如,将继承 ChangeList
并覆盖 get_filters
的解决方案)。
关于Django-Admin:来自 UserProfile 的 list_filter 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2251851/
我需要在 java 中添加一个用户配置文件变量,显然 %userprofile% 不起作用。当我尝试将其输入代码底部的目录时,它不接受它。但是我可以在命令行中回显我的 %userprofil% 用户配
我正在尝试将用户字段添加到用户配置文件管理选项卡中,以便能够在一个选项卡中更改每个用户属性。问题是 cmd 返回: 编辑:根据商王的评论编辑了代码,但仍然引发错误: : (admin.E202) 'a
我尝试导入 {{ user.userprofile. }} 和 {{ user.userprofile }} 没有成功。在 django shell 中,我可以使用 UserProfile.objec
我想获取桌面目录文件夹,所以我尝试了: char filename[ MAX_PATH ]; char newLocation[]="%userprofile%\\desktop\\myfil
在我的Yaml电话中,我有 --- title: "`r paste0('Test. Done ', format(Sys.Date(), '%B-%Y'))`" output: word_doc
我需要帮助将当前记录的 %USER% 添加到路径中,这是我目前的代码: DirectoryInfo dir = new DirectoryInfo(@"%USERPROFILE%\Local Sett
我想开始我的程序 start %USERPROFILE%\.myProgramm\myProgramm.exe 但现在我收到一条弹出消息,提示找不到文件夹 C:\Documets。这是由缺少省略号引起
我的代码正确吗?似乎可以编译但不能正常工作.. CString testing = _T(" --url=") + cstring + _T(" --out=%USERPROFILE%\\snapsh
所以我试图将我的文件保存到 C: 驱动器上的文档中。所以它允许我把它给别人,它会保存到他们的文档中。 我阅读了 %USERPROFILE% 的意思是抓取 C:\Users\%USERPROFILE%\
我正在尝试为用户创建一个小应用程序以获取联系人。我使用 django-profiles 作为我的个人资料的基础。现在一切正常,直到我尝试提交编辑联系表单并收到此错误。 Cannot assign ""
所以我用字段 score 扩展了我的用户。像这样: 模型.py: class UserProfile(models.Model): user = models.OneToOneField(Us
在.NET中,我们可以检索“特殊文件夹”的路径,例如文档/桌面等。今天我试图找到一种方法来获取“下载”文件夹的路径,但它看起来不够特别。 我知道我可以只执行“C:\Users\Username\Dow
我想创建一个“更新用户的个人资料”页面来让用户修改他们的个人资料,所以我想出了以下模型: class Profile(models.Model): user = models.OneToOne
我正在试验文件夹重定向,在设置它之后,我很快意识到任何具有环境变量(例如 %UserProfile%)的 VBS 脚本都变得不可用。 例如: C:\MD %UserProfile%\Desktop\
我尝试按照 https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#extending-the-existing-user-mod
我正在尝试运行 .save() 来更改用户模型字段的值。 这是我的代码: View .py: def traffic_task(request): tasks_traffic = Task.o
如果省略\My Documents\,以下函数将起作用,但我需要访问我的文档。 OpenTextFile("test.txt"); function OpenTextFile(file) {
我希望用户只能登录和注销,不能自己编辑他们的个人资料,只有管理员可以注册和编辑用户和他们的个人资料。 # my_app/models.py from django.db import models f
我用这样的用户配置文件扩展 django 用户模型: class UserProfile(BaseModel): user = models.ForeignKey(User, unique=T
我在 Django 中选择数据时遇到一些问题。 models.py class Location(models.Model): user = models.ForeignKey(User, o
我是一名优秀的程序员,十分优秀!