Как отфильтровать внешний ключ в форме Django, не передавая значение внешнего ключа? - PullRequest
0 голосов
/ 26 сентября 2018

Я создал две модели в моем проекте django AddStudent и Fee Entry, как показано ниже.

models.py

class AddStudent(models.Model):
    enrollment_no = models.BigIntegerField(primary_key=True)
    student_name = models.CharField(max_length=500,null=True)
    gender = models.CharField(max_length=1,choices=GENDER_CHOICES)
    course = models.ForeignKey(CourseMaster, on_delete=models.DO_NOTHING, null=True)
    category= models.ForeignKey(CatMaster, on_delete=models.DO_NOTHING, null=True)
    admission_year = models.IntegerField(('year'), choices=YEAR_CHOICES, default=datetime.datetime.now().year)
    college = models.ForeignKey(CollegeMaster, on_delete=models.DO_NOTHING, null=True)
    branch = models.ForeignKey(BranchMaster,on_delete=models.DO_NOTHING, null=True)
    current_semester = models.IntegerField(null=True)
    address = models.CharField(max_length=1000,null=True)
    city = models.CharField(max_length=100,null=True)
    district = models.CharField(max_length=100,null=True)
    state = models.CharField(max_length=100,null=True)
    student_contact = models.BigIntegerField()
    parent_contact = models.BigIntegerField()

    def get_absolute_url(self):
        return reverse('add_student:index')

    def __str__(self):
        return str(self.enrollment_no) + ' - ' + self.student_name

class FeeEntry(models.Model):

    student = models.ForeignKey(AddStudent,on_delete=models.DO_NOTHING)
    fee_detail = models.ForeignKey(FeeMaster,on_delete=models.DO_NOTHING)
    fee_sem = models.IntegerField(null=True)
    payment_date = models.DateField(("Date"), default=datetime.date.today)
    pay_method = models.BooleanField(choices=BOOL_CHOICES)
    cheque_no = models.CharField(max_length = 100, null=True, blank=True)
    bank_name = models.CharField(max_length = 200, null=True, blank=True)

    def __str__(self):
        return str(self.id) + ' - ' + str(self.student) + ' - ' + self.student.student_name

Теперь, когда пользователь ищет конкретного ученикаНапример, идентификатор студента = 1, после чего откроется страница профиля студента и есть еще одна кнопка addfee.Моя проблема в том, что когда пользователь нажимает на кнопку «Добавить плату», в раскрывающемся списке появляется список всех 500 учеников.Я хочу создать плату только для разыскиваемого студента.

forms.py

from django import forms
from .models import FeeEntry, AddStudent
from bootstrap_modal_forms.mixins import PopRequestMixin, CreateUpdateAjaxMixin

class FeeForm(PopRequestMixin, CreateUpdateAjaxMixin, forms.ModelForm):
    class Meta:
        model = FeeEntry
        fields = ['student', 'fee_detail', 'fee_sem', 'payment_date', 'pay_method','cheque_no','bank_name']

выше - это мой файл forms.py, в котором поле 'student' сгенерирует весь список из 500 студентов.Я хочу, чтобы только выбранный студент, например, enrollment_no = 1, когда пользователь находится на странице enrollment_no 1.

views.py

class FeeCreateView(PassRequestMixin, SuccessMessageMixin,
                         generic.CreateView):
    template_name = 'add_student/create_fee.html'
    form_class = FeeForm
    success_message = 'Success: Book was created.'
    success_url = reverse_lazy('add_student:detail')

urls.py

path('create/<int:pk>', views.FeeCreateView.as_view(), name='create_fee'),

Может кто-нибудь сказать мне, какие изменения необходимы в этом коде?или можете поделиться ссылкой на подобный пример вот так?

1 Ответ

0 голосов
/ 27 сентября 2018

FeeForm не знает, с каким студентом вы хотите связать его.По этой причине он показывает раскрывающийся список с вопросом о том, какого ученика вы хотите назначить экземпляру FeeEntry.

Удалите 'ученик' из формы и отправьте форму на просмотр.когда пользователь отправляет форму, используйте метод form_valid (form.is_valid, если вы используете FBV), чтобы назначить студента экземпляру fee_entry.

def form_valid(self, form):
    fee_entry = form.save(commit=False)
    fee_entry.student = AddStudent.objects.get(id=self.kwargs['student_id'])
    fee_entry.save()

Также убедитесь, что вы отправили студента_id в URL.Вы даже можете отправить его как параметр POST (узнайте, как извлечь параметр из запроса POST), используя скрытое поле в форме.

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