我正在尝试创建一个动态字段,因为我需要在服务模型中按组显示个人消息。
因此,我必须在服务表单上动态创建一些字段。
这是我的ServiceForm:
class ServicesForm(forms.ModelForm):
role = forms.ModelChoiceField(queryset=Group.objects.all(), required=False)
def __init__(self, *args, **kwargs):
super(ServicesForm, self).__init__(*args, **kwargs)
try:
for elem in Group.objects.all():
i = elem.pk
service = kwargs['instance']
group = elem
if RoleMessage.objects.filter(service=service, role=group).count() > 0:
default = RoleMessage.objects.get(service=service, role=group).message
else:
default = ""
self.fields[elem.name+'_message'] = forms.CharField(widget=forms.Textarea(attrs={'class': str(i)+'_message'}), initial=default, required=False)
except:
pass
class Meta:
model = Services
fields="__all__"
这是我的ServiceAdmin:
class ServicesAdmin(admin.ModelAdmin):
form = ServicesForm
list_display = (
'serviceName',
)
def get_fieldsets(self, request, obj=None):
fieldsets = super(ServicesAdmin, self).get_fieldsets(request, obj)
if obj != None:
limit = len(fieldsets[0][1]['fields']) - 1
index = 0
for elem in Group.objects.all():
i = elem.pk
fieldsets[0][1]['fields'].insert(limit+index, elem.name+'_message')
index += 1
return ((None, {'fields': fieldsets[0][1]['fields'],}),)
这是我尝试打开或创建服务时遇到的错误:
Unknown field(s) (ServicesManager_message, Administradores_message) specified for Services. Check fields/fieldsets/exclude attributes of class ServicesAdmin.
我的model.py是:
class Services(models.Model):
serviceName = models.CharField(
blank=False,
max_length=50
)
class Meta:
db_table = "service"
class RoleMessage(models.Model):
service = models.ForeignKey(Services, blank=False)
role = models.ForeignKey(Group, blank=False)
message = models.CharField(max_length=256, blank=False, default="")
答案 0 :(得分:1)
我在这里回答我的更改以解决问题。
我的ServiceAdmin也发生了变化:
fieldsets = (
(None, {
'fields': (
'serviceName',
),
}),
)
def get_form(self, request, obj=None, **kwargs):
kwargs['fields'] = flatten_fieldsets(self.declared_fieldsets)
return super(ServicesAdmin, self).get_form(request, obj, **kwargs)
def get_fieldsets(self, request, obj=None):
fieldsets = super(ServicesAdmin, self).get_fieldsets(request, obj)
newfieldsets = list(fieldsets)
fields = ['role']
if obj != None:
for elem in Group.objects.all():
fields.append(elem.name+'_message')
newfieldsets.append(['Custom Message', {'fields': fields}])
return newfieldsets