Этот вопрос похож на Set model field choices attribute at run time? Однако проблема заключается в том, что я хочу изменить значение по умолчанию для атрибута выбора на уровне класса.Изменить атрибут выборки в поле модели
Я это
class Project(models.Model):
name = models.CharField(...)
@staticmethod
def getAllProjectsTuple():
return tuple([(p.id, p.name) for p in Project.objects.all()])
class Record(models.Model):
project = models.ForeignKey(
Project,
verbose_name='Project',
help_text='Project name',
blank=True, null=True,
on_delete=models.SET_NULL,
choices = Project.getAllProjectsTuple(),
class RecordForm(ModelForm):
class Meta:
model = Record
Моя проблема заключается в том, что все RecordForm будет создан с TypedChoiceField, используя доступные варианты, которые были в модели во время импорта модуля. Однако пользователи могут создавать больше проектов, и они никогда не появятся в RecordForm; то же самое для удаления.
Я попытался фальсификация непосредственно с инициализации в RecordForm:
self.fields['project']._choices = [('', '---------'),] + [(p.id, p.name) for p in Project.objects.all()]
или с инициализации из записи:
self._meta.get_field('project')._choices = Project.getAllProjectsTuple()
, но ничего, кажется, работает.
Благодарим за помощь.
Почему вы используете варианты вообще, а не просто используете стандартный 'ModelSelectWidget' с набором запросов? Поведение по умолчанию такое же, как поведение 'getAllProjectsTuple'. –
Как насчет только 'choice = Project.objects.values_list ('id', 'name')'? – karthikr
@Peter, это фактически решило его. Я не уверен, что понимаю, как это сделать. Это какая-то магия Django, которая будет переоценивать выбор все время, если я не переоцениваю его? Спасибо ! – Ptah