【问题标题】:Filtering Forms in Django在 Django 中过滤表单
【发布时间】:2022-01-20 05:17:27
【问题描述】:

我正在做一个小项目来给推销员打分。我有地区,每个地区都有销售员。因此,如果选择了区域“blahblah”,则表单应显示与该区域相关的销售人员选择。我通过 stackoverflow 找到了一些答案,但它仍然显示所有销售人员,无论他们所在的地区。

我的模型是这样的:

class Region(models.Model):
    name = models.CharField(max_length=50)
    slug = models.SlugField(max_length=50, unique=True)
    
    def __str__(self):
        return self.name

class Salesman(models.Model):
    region = models.ForeignKey(Region,
                               related_name='region',
                               on_delete=models.CASCADE)
    name = models.CharField(max_length=40)
    surname = models.CharField(max_length=40)
    
    def __str__(self):
        return self.name
    

class Rating(models.Model):
    RATING_CHOICES = [(i, str(i)) for i in range(1,6)]
    salesman = models.ForeignKey(Salesman,
                                 related_name='salesman',
                                 on_delete=models.CASCADE)
    phone = models.CharField(max_length=15, blank=True)
    rating = models.IntegerField(choices=RATING_CHOICES, blank=False)
    sent_time = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.phone

我发现我的 forms.py 修改了 __init__ 方法:

class RateAddForm(forms.ModelForm):
    class Meta:
        model = Rating

    def __init__(self, region_id=None, **kwargs):
        super(RateAddForm, self).__init__(**kwargs)
        if region_id:
            self.fields['salesman'].queryset = Salesman.objects.filter(region=region_id)

还有我的views.py是这样的:

def report_add(request, region_id):
    if request.method == 'POST':
        print(region_id)
        form = RateAddForm(request.POST, region_id=region_id)
        if form.is_valid():
            message = "Thanks!"
            form.save()
            return HttpResponse(message)
        else:
            print("Something went wrong!")
            form = RateAddForm()
    else:
        form = RateAddForm(request.POST)
    return render(request,
                  'account/report.html',
                  {'form': form})

即使我选择了一个地区,它仍然会显示我数据库中的所有销售人员。如何解决这个表格应该只显示选定区域的销售人员的问题。提前致谢!

【问题讨论】:

  • 我不知道,但这看起来好像查询集被超类 __init__ method 扩展为一个选择实例?

标签: python django forms


【解决方案1】:

尝试设置self.base_fields['salesman'].queryset 而不是 self.fields['salesman'].queryset(即“base_fields”而不是“fields”)。

(当我需要在管理员表单中进行过滤时,我会这样做)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-04
    • 2012-01-24
    • 2014-06-20
    • 1970-01-01
    • 2017-03-29
    • 2020-10-12
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多