Вывод в форму модели с 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>

picture введите сюда описание изображения

в чем дело? почему выводит 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}} - выведет первичный ключ(цифру,а не строку с именем). Очень подробно обьяснил:)

→ Ссылка