我正在尝试将默认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中每个对象的字符串表示形式显示为内联中的只读字段。
提前致谢!
答案 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__
由于它被禁用并标记为只读,因此无法更改该值,但会显示正确的字符串值。