Rud*_*lah 12 django django-admin
我有一个具有CharField的模型,在管理员中我想为窗口小部件添加选项.这样做的原因是我使用的是代理模型,并且有许多模型共享这个CharField,但它们各有不同的选择.
class MyModel(MyBaseModel):
stuff = models.CharField('Stuff', max_length=255, default=None)
class Meta:
proxy = True
class MyModelAdmin(admin.ModelAdmin):
fields = ('stuff',)
list_display = ('stuff',)
admin.site.register(MyModel, MyModelAdmin)
Run Code Online (Sandbox Code Playgroud)
对于这种模式,我想用MY_CHOICES在MyModelAdmin.
我是否覆盖小部件?我需要覆盖整个表单吗?
dem*_*mux 19
from django.contrib import admin
from django import forms
class MyModel(MyBaseModel):
stuff = models.CharField('Stuff', max_length=255, default=None)
class Meta:
proxy = True
class MyModelForm(forms.ModelForm):
MY_CHOICES = (
('A', 'Choice A'),
('B', 'Choice B'),
)
stuff = forms.ChoiceField(choices=MY_CHOICES)
class MyModelAdmin(admin.ModelAdmin):
fields = ('stuff',)
list_display = ('stuff',)
form = MyModelForm
admin.site.register(MyModel, MyModelAdmin)
Run Code Online (Sandbox Code Playgroud)
请参阅:https://docs.djangoproject.com/en/dev/ref/forms/fields/#choicefield
您不需要自定义表单。
这是您需要的最低限度:
# models.py
from __future__ import unicode_literals
from django.db import models
class Photo(models.Model):
CHOICES = (
('hero', 'Hero'),
('story', 'Our Story'),
)
name = models.CharField(max_length=250, null=False, choices=CHOICES)
# admin.py
from django.contrib import admin
from .models import Photo
class PhotoAdmin(admin.ModelAdmin):
list_display = ('name',)
admin.site.register(Photo, PhotoAdmin)
Run Code Online (Sandbox Code Playgroud)
您需要覆盖ModelAdmin将要使用的表单:
class MyForm(forms.ModelForm):
stuff = forms.CharField('Stuff', max_length=255, choices=MY_CHOICES, default=None)
class Meta:
model = MyModel
fields = ('stuff', 'other_field', 'another_field')
class MyModelAdmin(admin.ModelAdmin):
fields = ('stuff',)
list_display = ('stuff',)
form = MyForm
Run Code Online (Sandbox Code Playgroud)
如果你需要你的选择是动态的,也许你可以做类似的事情:
class MyForm(forms.ModelForm):
stuff = forms.CharField('Stuff', max_length=255, choices=MY_CHOICES, default=None)
def __init__(self, stuff_choices=(), *args, **kwargs):
# receive a tupple/list for custom choices
super(MyForm, self).__init__(*args, **kwargs)
self.fields['stuff'].choices = stuff_choices
Run Code Online (Sandbox Code Playgroud)
并在您的ModelAdmin' s 中__init__定义将是什么MY_CHOICES并在那里分配表单实例:
祝你好运!:)
小智 5
您可以通过formfield_for_choice_field()这种方式覆盖而无需创建新表单。
class MyModelAdmin(admin.ModelAdmin):
def formfield_for_choice_field(self, db_field, request, **kwargs):
if db_field.name == 'status':
kwargs['choices'] = (
('accepted', 'Accepted'),
('denied', 'Denied'),
)
if request.user.is_superuser:
kwargs['choices'] += (('ready', 'Ready for deployment'),)
return super().formfield_for_choice_field(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22312 次 |
| 最近记录: |