我正在努力实现一个简单的查询集过滤器,因为我找不到如何获取我的表单的当前 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 form的current ID以将其与BDC form的“ref”进行比较,以便我可以用结果填充小部件?
谢谢
您不能将涉及非常量值的查询集放入类定义中。导入模块时定义类。
(好吧,小谎言。您可以将类定义为视图内的内部类,而不是模块范围。事实上,我什至不确定为什么这是个坏主意,除了我从未见过或尝试过它。毕竟有
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')
)
...