【问题标题】:how to filter foreign key in django form without passing foreign key value?如何在不传递外键值的情况下过滤 django 形式的外键?
【发布时间】:2019-03-02 10:51:55
【问题描述】:

我在我的 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

现在,当用户搜索特定学生时,例如学生 id = 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 文件,其中字段“学生”将生成所有 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'),

谁能告诉我此代码需要进行哪些更改?或者您可以分享类似示例的链接吗?

【问题讨论】:

    标签: django-models django-forms foreign-keys


    【解决方案1】:

    FeeForm 不知道您想与哪个学生关联。因此,它会向您显示一个下拉菜单,询问您要将哪个学生分配给 FeeEntry 实例。

    从表单中删除“学生”并将表单发送到视图。当用户提交表单时,使用 form_valid(如果您使用 FBV,则为 form.is_valid)方法将学生分配给 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()
    

    还要确保在 url 中发送 student_id。您甚至可以使用表单中的隐藏字段将其作为 POST 参数发送(查看如何从 POST 请求中检索参数)。

    【讨论】:

    • 感谢您的回答。但我是 django 的初学者。我明白你的回答,但是当我尝试这个改变时,一切都搞砸了。
    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 2020-09-07
    • 2012-01-23
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多