Django窗体上的动态自动创建字段问题

2024-04-23 14:28:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个动态字段,因为我需要在服务模型中为每个组提供一条个人消息。你知道吗

因此,我必须在我的服务表单上动态创建一些字段。你知道吗

这是我的服务表单:

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__"

这是我的服务管理员:

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.

我的型号.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="")

Tags: selffalsedefaultmessagefieldsobjectsmodelsservice
1条回答
网友
1楼 · 发布于 2024-04-23 14:28:49

我已经解决了这个问题。Django1.8中的一些内容发生了变化,实现是从1.5开始的。你知道吗

在这里我回答我的变化,以解决问题。你知道吗

在我的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

相关问题 更多 >