Как получить конкретный внешний ключ для отображения из функции def __str__? - PullRequest
0 голосов
/ 07 июня 2019

У меня есть класс (table4) с двумя внешними ключами (тема и вопрос) для другого класса (table3).Теперь, когда я ввожу данные на сайт администратора django для table4, я хочу, чтобы только затем имена тем, вставленные в table3, приходили, и только вопросы, вставленные в table3, появлялись в ползунке.Есть ли в любом случае это сделать?

class table3(models.Model):
    id1=models.IntegerField(default=0)
    topic=models.CharField(max_length=222)
    question=models.CharField(max_length=222)
    answer=models.CharField(max_length=222)

    def __str__(self):
        return self.question

#for the user to enter
class table4(models.Model):
    username = models.CharField(max_length=222)
    topic1 = models.ForeignKey(table3, related_name='topic1',on_delete=models.CASCADE)
    question1=models.ForeignKey(table3, related_name='question1',on_delete=models.CASCADE)
    answer = models.CharField(max_length=222)

    def __str__(self):
        return self.username

1 Ответ

1 голос
/ 07 июня 2019

Вам просто нужно два переопределения, чтобы сделать это.

Сначала создайте два класса и верните желаемый текст, который вы хотите отобразить в опции внешнего ключа.

class QuestionChoiceField(forms.ModelChoiceField):
     def label_from_instance(self, obj):
         return "Question: {}".format(obj.question)

class TopicChoiceField(forms.ModelChoiceField):
     def label_from_instance(self, obj):
         return "Topic: {}".format(obj.topic)

Теперь в администраторе следующей модели добавьте следующую функцию.

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == 'question':
        return QuestionChoiceField(queryset=Table3.objects.all())
    if db_field.name == 'topic':
        return TopicChoiceField(queryset=Table3.objects.all())
    return super().formfield_for_foreignkey(db_field, request, **kwargs)
...