2013-11-22 3 views
0

Этот вопрос похож на 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() 

, но ничего, кажется, работает.

Благодарим за помощь.

+1

Почему вы используете варианты вообще, а не просто используете стандартный 'ModelSelectWidget' с набором запросов? Поведение по умолчанию такое же, как поведение 'getAllProjectsTuple'. –

+1

Как насчет только 'choice = Project.objects.values_list ('id', 'name')'? – karthikr

+0

@Peter, это фактически решило его. Я не уверен, что понимаю, как это сделать. Это какая-то магия Django, которая будет переоценивать выбор все время, если я не переоцениваю его? Спасибо ! – Ptah

ответ

0

Я просто понял, что:

self.fields['project'].choices = [('', '----------')] + [(p.id, p.name) for p in Project.objects.all()] 

В инициализации в RecordForm также делает трюк. Но @Peter DeGlopper отвечает в комментариях лучше.

Смежные вопросы