如何更改ManyToManyField小部件?

时间:2015-05-07 20:33:03

标签: django django-admin

我正在尝试将默认ManyToManyField小部件更改为TextInput并将其设为只读。同时我试图显示ManyToManyField在TextInput中曾经拥有的值,但我似乎无法管理......这些是我的模型:

表格

class ParticipantInlineForm(forms.ModelForm):

    class Meta:
        model = Participant
        widgets = {
            'persons': forms.TextInput
        }

    def __init__(self, *args, **kwargs):
        super(ParticipantInlineForm, self).__init__(*args,**kwargs)
        instance = kwargs.get('instance')
        string = ''
        if instance:
            for person in instance.persons.all():
                string = string + str(person)
            self.fields['persons'].initial = string

内联

class SimpleParticipantInline(admin.TabularInline):
    model = Participant
    extra = 0
    fields = ( 'persons',)
    form = ParticipantInlineForm

    def has_delete_permission(self, request, obj=None):
        return False

    def has_add_permission(self, request, obj=None):
        return False

模型

class Person(models.Model):
        name = models.CharField(max_length=25, default='',  verbose_name='Nombre')
        lastname = models.CharField(max_length=25, default='',  verbose_name='Apellido')
        phone = models.CharField(max_length=30, default='',  verbose_name='Telefono')
        email = models.CharField(max_length=30, default='',  verbose_name='Email')


        def __str__(self):            
            return self.name + ' ' + self.lastname

        class Meta:
            verbose_name = "Persona"
            verbose_name_plural = "Personas"

class Participant(models.Model):
        persons = models.ManyToManyField(Person)
        tournament = models.ForeignKey(Tournament, default='', verbose_name='Torneo')
        TEAM_NUMBER_CHOICES = (
            ('1', 'Equipo 1'),
            ('2', 'Equipo 2'),
            ('3', 'Equipo 3'),
            ('4', 'Equipo 4'),
            ('5', 'Equipo 5'),
            ('6', 'Equipo 6'),
            ('7', 'Equipo 7'),
            ('8', 'Equipo 8'),
            ('9', 'Equipo 9'),
        )
        team_number = models.CharField(max_length=2, verbose_name='Numero de Equipo', choices=TEAM_NUMBER_CHOICES, default='', blank=True)
        TEAM_FORMAT_CHOICES = (
            ('Singles 1', 'Singles 1'),
            ('Doubles 1', 'Doubles 1'),
            ('Singles 2', 'Singles 2'),
            ('Doubles 2', 'Doubles 2'),
            ('Singles 3', 'Singles 3'),
            ('Doubles 3', 'Doubles 3'),
            ('Singles 4', 'Singles 4'),
            ('Doubles 4', 'Doubles 4'),
            ('Singles 5', 'Singles 5'),
            ('Doubles 5', 'Doubles 5'),
            ('Singles 6', 'Singles 6'),
            ('Doubles 6', 'Doubles 6'),
        )
        team_format = models.CharField(max_length=9, verbose_name='Formato de Equipo', choices=TEAM_FORMAT_CHOICES, default='', blank=True)

        def __str__(self):
            string = ''
            if self.team_number and self.team_format:
                string = 'Equipo ' + self.team_number + ' ' + self.team_format
            else:
                for person in self.persons.all():
                    string = string + person.__str__() + ' '
            return string


        class Meta:
            verbose_name = "Participante"
            verbose_name_plural = "Participantes"

我使用此代码更改了小部件,但值不正确。 它显示了the docs之类的整数。我认为他们可能是个人的......

我也尝试重新定义窗口小部件,但旧的ManyToManyField对象不会到达那里,我无法设置初始值,任何帮助?

我只是想将ManyToManyField中每个对象的字符串表示形式显示为内联中的只读字段。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我知道问题是2岁,但是试图回答其他正在寻找类似事物的人。

您可以使用类似于ManyToManyField,SelectMultiple的小部件,但只需将其标记为只读和禁用。在表单__init__内将这些标记为已禁用或只读可能不起作用。它应该作为Meta小部件部分的一部分来完成。

class ParticipantInlineForm(forms.ModelForm):
    class Meta:
        model = Participant
        widgets = {
            'persons': forms.SelectMultiple(attrs={'readonly': 'True', 'disabled': 'True'})
        }

确保已对Persons类中的有意义文本实施__str__

由于它被禁用并标记为只读,因此无法更改该值,但会显示正确的字符串值。