Показать ассоциированное значение внешнего ключа в createview django - PullRequest
0 голосов
/ 09 января 2019

У меня есть две модели: store и claim, где store - внешний ключ claim. Я использую CreateView общие представления. В форме во внешнем интерфейсе я вижу список store как username + Store, но я хочу отобразить имя магазина как метку опции и идентификатор в значении в раскрывающемся списке.

Две модели похожи на:

class Store(models.Model):
    user = models.OneToOneField(Ext_User, on_delete=models.CASCADE)
    store_name = models.CharField(max_length=50, default='', null=True, blank=True)
    description = models.CharField(max_length=50, default='', null=True, blank=True)
    ....

class Claim(models.Model):    
    store = models.ForeignKey(Store, on_delete=models.CASCADE)
    expense = models.DecimalField(max_digits=999, decimal_places=0)
    customer = models.ForeignKey(Ext_User, on_delete=models.CASCADE)
    ....

класс создания заявки:

class ClaimCreateView(CreateView):
    model = Claim
    template_name = 'claim/claim_form.html'
    fields = ['store', 'expense']

def form_valid(self, form):
    form.instance.customer = self.request.user   
    return super().form_valid(form)

def test_func(self):
    claim = self.get_object()
    if self.request.user == claim.customer:
        return True
    return False 

что я вижу на фронтенде:

enter image description here Я хочу отобразить store name вместо этих значений по умолчанию.

1 Ответ

0 голосов
/ 09 января 2019

Вы можете переопределить метод __str__() модели магазина

Всякий раз, когда мы пытаемся напечатать какой-либо объект в Python, Python внутренне вызывает его метод __str__(), чтобы получить строковое представление этого объекта.

Таким образом, мы можем переопределить значение по умолчанию __str__(), если мы хотим предоставить настраиваемое представление нашего объекта.

Для вашей модели Магазина вы можете сделать что-то вроде этого:

class Store(models.Model):
    user = models.OneToOneField(Ext_User, on_delete=models.CASCADE)
    store_name = models.CharField(max_length=50, default='', null=True, blank=True)
    description = models.CharField(max_length=50, default='', null=True, blank=True)

    def __str__(self):
        return "%s owned by %s " % (self.store_name, self.user)

Таким образом, всякий раз, когда вы пытаетесь напечатать любой объект Store, для этого конкретного экземпляра будет вызываться этот метод __str__(), и будет возвращаться значение, возвращаемое этим методом, которое может быть чем-то вроде ABC Store owned by Xyz

Ссылка: https://docs.djangoproject.com/en/2.1/ref/models/instances/#str

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...