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

时间:2015-11-05 22:21:30

标签: python django

我正在尝试创建一个动态字段,因为我需要在服务模型中按组显示个人消息。

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

这是我的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="")

1 个答案:

答案 0 :(得分:1)

我解决了这个问题。 Django 1.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