首页 > 解决方案 > 基于 URL 参数过滤下拉查询集

问题描述

我正在构建一个 CRM,我希望每个客户都有多个计划,并且每个计划都有多个注释。当用户创建新笔记时,我希望他们能够从属于客户的计划下拉列表中选择相关计划。据我所知,我应该能够从 kwargs 中获取 contact_id,但是我的错误在 kwargs 中没有显示任何内容。我知道应该有办法做到这一点,但我似乎无法找到它。

Variable    Value
__class__   <class 'lynx.forms.SipNoteForm'>
args    ()
kwargs  {}
self    <SipNoteForm bound=False, valid=Unknown, fields=(sip_plan;note;note_date;fiscal_year;quarter;class_hours;instructor;clients)>

视图.py

@login_required
def add_sip_note(request, contact_id):
    form = SipNoteForm()
    if request.method == 'POST':
        form = SipNoteForm(request.POST)
        if form.is_valid():
            form = form.save(commit=False)
            form.contact_id = contact_id
            form.user_id = request.user.id
            form.save()
            return HttpResponseRedirect(reverse('lynx:client', args=(contact_id,)))
    return render(request, 'lynx/add_sip_note.html', {'form': form})

表格.py

class SipNoteForm(forms.ModelForm):
    class Meta:
        model = SipNote
        exclude = ('created', 'modified', 'user', 'contact')

    def __init__(self, *args, **kwargs):
        super(SipNoteForm, self).__init__(*args, **kwargs)
        self.fields['sip_plan'].queryset = SipPlan.objects.filter(contact_id=kwargs.get("contact_id"))

网址.py

path('add-sip-note/<int:contact_id>/', views.add_sip_note, name='add_sip_note'),

标签: djangoforms

解决方案


你正试图kwargs进入__init__(self, *args, **kwargs)

    def __init__(self, *args, **kwargs):
        contact_id = kwargs.pop('contact_id')
        super(SipNoteForm, self).__init__(*args, **kwargs)
        self.fields['sip_plan'].queryset = SipPlan.objects.filter(contact_id=contact_id)

但是您contact_id kwargs在发布时没有传递给表单。你应该传递kwargs给你将要进入的表格,__init__(self, *args, **kwargs)例如

@login_required
def add_sip_note(request, contact_id):
    form = SipNoteForm()
    if request.method == 'POST':
        form = SipNoteForm(request.POST, contact_id=contact_id)

推荐阅读