Django: У меня есть объект A с FK на B. Как я могу отобразить столбцы из B в раскрывающемся списке в виде A? - PullRequest
0 голосов
/ 24 сентября 2019

Я получаю сообщение об ошибке «Неизвестные поля (темы, темы), указанные для сеанса».Я пытаюсь создать раскрывающийся список для темы и темы в моем sessionForm.

Моя модель ниже:

class Subject(models.Model):
    name = models.CharField(max_length = 30, primary_key = True)       

    def __str__(self):
      return self.name

    class Meta:
        db_table = 'subjects'  

class Module(models.Model):
  topic   = models.CharField(max_length = 200)  
  subject = models.ForeignKey(Subject, on_delete=models.CASCADE)  

  def __str__(self):
    return self.topic + ' in ' + self.subject.name

  class Meta:
        db_table = 'modules'         

class Session(models.Model):
   grade_level  = models.CharField(max_length = 30)
   num_students = models.IntegerField(default=0)
   session_dt = models.DateTimeField() 
   module = models.ForeignKey(Module, on_delete=models.CASCADE)

  @property
   def subject(self):
        return self.module.subject

   def topic(self):
        return self.module.topic   

   def __str__(self):
     return self.module.topic + ' on ' + self.session_dt

   class Meta:
        db_table = 'sessions' 

Мой файл forms.py -

class SessionForm(forms.ModelForm):

    class Meta:
        model = Session      
        fields = ['subject', 'topic', 'session_dt', 'grade_level', 'num_students']

Я новичок в Django и Python.Я уже посмотрел статью Витора Фрейтаса в выпадающем списке.

1 Ответ

0 голосов
/ 24 сентября 2019

Один из способов сделать это - переопределить метод init класса ModelForm и присоединить нужные поля к полям формы, например:



class SessionForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(SessionForm, self).__init__(*args, **kwargs)
        self.fields['subject'].queryset = Subject.objects.all()
        self.fields['topic'].queryset = Module.objects.none()

        if 'subject' in self.data: # This will be checked when you are saving the form via a POST method
            try:
                subject_id = int(self.data.get('subject'))
                self.fields['topic'].queryset = Module.objects.filter(subject_id=subject_id)
            except:
                # catch your errors here if the form contains invalid data
        elif self.instance.pk:
            self.fields['topic'].queryset = self.instance.subject.module_set


    class Meta:
        model = Session      
        fields = ['subject', 'topic', 'session_dt', 'grade_level', 'num_students']


Я думаю, что Subject в качестве внешнего ключадля Session имеет смысл в вашем случае, как Session -> Subject -> Module.Кроме того, вам придется выполнять вызов AJAX, когда значение раскрывающегося объекта изменяется в вашей форме.Поэтому создайте отдельную функцию представления, сопоставьте ее с URL-адресом и внутри этой функции сделайте следующее:


def load_modules(request):
    subject_id = request.GET.get('subject')
    modules = Modules.objects.get(id=subject_id)
    return render(request, `template name here`, {'modules': modules})

...