ban*_*ity 12 django django-admin
我有一个对内置用户模型有一个ForeignKey的模型django.contrib.auth,我对管理员中的选择框总是按用户的主键排序而感到沮丧.
我更倾向于按字母顺序按用户名排序,虽然我的本能不是想要摆弄Django的内部,但我似乎无法找到一种更简单的方法来重新排序用户.
我能想到的最简单的方法是进入我的Django安装并添加
ordering = ('username',)
Run Code Online (Sandbox Code Playgroud)
到User模型的Meta类.
有什么样的monkeypatching我可以做或任何其他侵入性较小的方式来修改用户模型的顺序?
或者,任何可以通过改变而破坏的东西都可以吗?
Jar*_*die 23
有一种方法可以使用ModelAdmin对象来指定自己的表单.通过指定自己的表单,您可以完全控制表单的组成和验证.
假设具有FK的模型User是Foo.
你myapp/models.py可能看起来像这样:
from django.db import models
from django.contrib.auth.models import User
class Foo(models.Model):
user = models.ForeignKey(User)
some_val = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
然后,您将创建一个myapp/admin.py包含以下内容的文件:
from django.contrib.auth.models import User
from django import forms
from django.contrib import admin
class FooAdminForm(forms.ModelForm):
user = forms.ModelChoiceField(queryset=User.objects.order_by('username'))
class Meta:
model = Foo
class FooAdmin(admin.ModelAdmin):
form = FooAdminForm
admin.site.register(Foo, FooAdmin)
Run Code Online (Sandbox Code Playgroud)
完成此操作后,<select>下拉列表将根据用户名对用户对象进行排序.无需担心其他字段Foo......您只需要在FooAdminForm类中指定覆盖.不幸的是,您需要为每个具有FK到用户的模型提供此自定义表单定义,以便在管理站点中显示.
elo*_*0ka 14
Jarret上面的回答应该是:
from django.contrib.auth.models import User
from django.contrib import admin
from django import forms
from yourapp.models import Foo
class FooAdminForm(forms.ModelForm):
class Meta:
model = Foo
def __init__(self, *args, **kwds):
super(FooAdminForm, self).__init__(*args, **kwds)
self.fields['user'].queryset = User.objects.order_by(...)
class FooAdmin(admin.ModelAdmin):
# other stuff here
form = FooAdminForm
admin.site.register(Foo, FooAdmin)
Run Code Online (Sandbox Code Playgroud)
因此,每次创建表单时都会重新评估queryset,而不是在导入包含表单的模块时重新评估一次.
| 归档时间: |
|
| 查看次数: |
4629 次 |
| 最近记录: |