Вывод в форму модели с foreignkey, показывает pk, а не его текстовое поле. Django, python
Вывожу модель в форму и в поле, где foreignkey выводит pk, а не name. Как поменять вывод на поле name?
то есть выводит pk который записан в основной модели, а не поле имени def __str__(self):
models
class Orders(models.Model):
device = models.ForeignKey('Device', null=True, blank=True, on_delete=models.PROTECT, verbose_name='Устройство', related_name='get_device')
def get_absolute_url(self):
return reverse('view_orders', kwargs={'pk': self.pk})
def __str__(self):
return str(self.pk)
class Device(models.Model):
name = models.CharField(max_length=150, db_index=True, unique=True, verbose_name='Устройство')
used = models.IntegerField(default=0)
def __str__(self):
return str(self.name)
forms
class SimpleOrderAddForm(forms.ModelForm):
class Meta:
model = Orders
fields = ['device']
widgets = {
'device': forms.TextInput(attrs={'id':'ajax-device', 'class': 'form-control', 'autocomplete':'off'}),
}
views
class OrderEditView(TemplateView):
template_name = 'orders/order_edit.html'
def get(self, request, *args, **kwargs):
context = super().get_context_data(**kwargs)
get_order = Orders.objects.get(pk=context['order_id'])
formOne = SimpleOrderAddForm(instance=get_order)
context.update({'formOne': formOne})
return self.render_to_response(context)
html
<form action="{% url 'order_edit' order_id %}" method="post">
{% csrf_token %}
{{ formOne.non_field_errors }}
{{ formOne.as_p }}
<button type="submit" class="btn btn-primary btn-block">Сохранить</button>
</form>
в чем дело? почему выводит pk, а не name модели?
Ответы (1 шт):
Допустим у вас есть 2 модели Статьи(Article) и Категории(Category), у статьи хранится внешний ключ на категорию. К примеру: g = Category.objects.get(id=2) - сделали запрос на определенную категорию из БД. И дальше мы хотим вывести статьи принадлежащие к этой категории. Так как у нас поле с foreignkey хранится в статьях(Article) мы воспользуемся модель_set ну или у поле со связью определим related_name(допустим posts), соответственно модель Category - первичная модель(с ней устанавливается связь),а Article - вторичная(в ней поле со связью). Теперь с помощью related_name(posts) обратимся к переменной g: g.posts.all(). Обьясняю: g- переменная, в которой находится категория, posts-related_name поля со связью статей и категория(это поле находится в статьях). То есть это такой "мост" между первичной моделью со вторичной(именно в таком порядке). И с помощью этого "моста" мы обращаемся к статьям в категории g и выводим их все (с помощью метода all() ),но допустим я хочу из определённой категории вывести определенную статью, это делается просто: мы делаем запрос на категорию,сохраняем её в переменную(допустим cat) и обращаемся к "мосту" - posts,который выведет статьи в категории cat: cat.posts.get(id=2). Если сказать в кратце, то из категории с id=2,мы запросили статью c id=2. Теперь эту статью запишем в context шаблона по ключу a. и в шаблоне при выводе {{a.title}} он выведет её заголовок, но допустим я хочу вывести категорию, к которой эта статья прикреплена. Очень просто! Я обращаюсь к полю со связью статей и категории(назовём его category-оно находится в Article): {{a.cayegory}} - выведете категорию статьи а, {{a.category.title}} - выведет имя категории статьи,а {{a.category.pk}} - выведет первичный ключ(цифру,а не строку с именем). Очень подробно обьяснил:)
