Django 获取当前 ID 以比较查询集过滤器中的两个表

问题描述 投票:0回答:1

我正在努力实现一个简单的查询集过滤器,因为我找不到如何获取我的表单的当前 ID。

view.py

def update_record(request, pk):
    if request.user.is_authenticated:
        current_record = Record.objects.get(id=pk)
        form = AddRecordForm(request.POST or None, instance=current_record)
        if form.is_valid():
            form.save()
            messages.success(request, "Record Has Been Updated!")
            return redirect('home')
        return render(request, 'update_record.html', {'form':form})
    else:
        messages.success(request, "You Must Be Logged In...")
        return redirect('home')

表格.py

class AddRecordForm(forms.ModelForm):
    testrever = forms.ModelMultipleChoiceField(widget=forms.widgets.SelectMultiple, queryset=BDC.objects.filter(ref = ???current.id.of.Record.model???).values_list('model'))

    class Meta:
        model = Record
        exclude = ("user",)



class BDCform(forms.ModelForm):
    ref = forms.CharField(required=False, widget=forms.widgets.TextInput(attrs={"placeholder":"First Name", "class":"form-control"}), label="")
    model = forms.CharField(required=False, widget=forms.widgets.TextInput(attrs={"placeholder":"Last Name", "class":"form-control"}), label="")

    class Meta:
        model = BDC
        exclude = ("user",)

模型.py

    class Record(models.Model):
        id = models.CharField(primary_key=True, max_length=50)
        testrever = models.JSONField(max_length=500) 
    
        def __str__(self):
            return (f"{self.first_name} {self.last_name}")

    class BDC(models.Model):
        ref = models.CharField(max_length=50)
        model = models.CharField(max_length=50)

我的问题是在

forms.py
的这一行:

queryset=BDC.objects.filter(ref = ???current.id.of.Record.model??? ).values_list('model')

如何获取Record formcurrent ID以将其与BDC form的“ref”进行比较,以便我可以用结果填充小部件?

谢谢

django forms filter django-queryset
1个回答
1
投票

您不能将涉及非常量值的查询集放入类定义中。导入模块时定义类。

(好吧,小谎言。您可以将类定义为视图内的内部类,而不是模块范围。事实上,我什至不确定为什么这是个坏主意,除了我从未见过或尝试过它。毕竟有

forms.modelform_factory
)。

你最好的选择是在实例化表单时传递查询集。子类形式的

__init__

def __init__(self, *args, **kwargs):
    bdcqs = kwargs.pop('bdc_qs', None) # Correctly obtains slug from url
    super().__init__(*args, **kwargs) 
    self.fields['testrever'].queryset = bdcqs 

在视图中,

def update_record(request, pk):
    if request.user.is_authenticated:
        current_record = Record.objects.get(id=pk)
        form = AddRecordForm(request.POST or None, 
            instance=current_record,
            bdc_qs = BDC.objects.filter(
                ref = pk   # if I understand the question right
            ).values_list('model')
        )
        ...
© www.soinside.com 2019 - 2024. All rights reserved.