2015-12-01 3 views
2

У меня есть две модели, Tag и TagGroup.Поле выбора Django, заполненное queryset - сохранить идентификатор, но показать значение

class TagGroup(models.Model): 
    tag_group_name = models.CharField(max_length=100) 

class Tag(models.Model): 
    tag_name = models.CharField(max_length=100) 
    tag_group = models.ForeignKey(TagGroup, blank=True, null=True) 

Я поставил TagGroup форму как поле выбора в шаблон, так что я могу назначить TagGroup в тег. Я создал эту форму для заполнения из запроса TagGroup.

class TagGroupForm(ModelForm): 
    tag_group_name = forms.ModelChoiceField(queryset=TagGroup.objects.values_list('id', 'tag_group_name'), required=False) 

    class Meta: 
     model = TagGroup 
     fields = [ 
      'tag_group_name' 
     ] 

Я не видел каких-либо очевидных инструкций, как я могу назначить Ид в таблице тегов, показывая пользователю только значение тега в поле выбора в шаблоне.

В настоящее время выше показывает:

enter image description here

Пара вопросов:

  1. является QuerySet правильно? Я пробовал без «values_list», но тогда он просто показывает «Объект» в поле формы в шаблоне?

  2. Как я могу скрыть идентификатор, чтобы сохранить его, показывая только фактическое значение строки в поле формы?


Edited добавить обновленный вид:

class TagGroupForm(ModelForm): 
    tag_group_name = forms.ModelChoiceField(queryset=TagGroup.objects.all(), to_field_name = 'tag_group_name', required=False) 

    class Meta: 
     model = TagGroup 
     fields = [ 
      'tag_group_name' 
     ] 

это теперь производит следующий .. выглядит близко .. значение форма имеет хорошую строку, но фактическое значение, отображаемое пользователю еще «Объект TagGroup». Как это показать?

enter image description here

ответ

2

От the docs,

ул (Юникода на Python 2) метод модели будет называться генерировать строковые представления объектов для использования

Просто просто присвойте это имени объекта, и все будет в порядке! (Кроме того, вам не нужно использовать values_list). Причина, по которой он показывает объект по умолчанию, состоит в том, что это то, что является строковым представлением по умолчанию.

class TagGroup(models.Model): 
    tag_group_name = models.CharField(max_length=100) 

    def __str__(self): 
     return self.tag_group_name 

tag_group_name = forms.ModelChoiceField(queryset=TagGroup.objects.all(), required=False) 

В противном случае, если вы не хотите изменять это и хотите зарезервировать его для других целей.

Для обеспечения индивидуальных представлений подкласс ModelChoiceField и переопределение label_from_instance.Этот метод получит объект модели, и должен возвращать строку, подходящую для представления его

class TagChoiceField(ModelChoiceField): 
    queryset = TagGroup.objects.all() 
    def label_from_instance(self, obj): 
     return obj.tag_group_name # or similar 
+0

я могу купить, что он способен связать идентификатор к выбранному объекту, так что я не нужно явно иметь QuerySet включить идентификатор. Однако, если я не укажу явным образом, какое поле использовать в качестве значения для отображения пользователя, он дает «объект TagGroup» в поле формы в качестве выбора. Если я скажу, какое поле использовать, например values_list ('tag_group_name'), то он показывает строку, но кодируется, как на моем скриншоте выше. – curtisp

+0

@genoki - Я не уверен, что вы видели мой первоначальный ответ или мою полностью переработанную версию, но текст, который он хочет отобразить, основан на строчном представлении модели, тогда вы можете выбрать другое значение * * используя 'to_field_name', если вы хотите, но так как вы просили по-прежнему использовать идентификатор в качестве значения, которое вам просто нужно для установки правильного отображаемого текста – Sayse

+0

спасибо. Я также попытался с именем 'to_field_name', который не возвращал желаемые результаты. Я обновил свой вопрос с его результатами. Кстати, что вы подразумеваете под представлением _string модели_? – curtisp

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