簡體   English   中英

Django 表單無法在下拉列表中過濾外鍵

[英]Django Form Can't Filter Foreign Key on Dropdown

編輯:為了清楚起見,重寫了描述

我有一個從全認證教程(Django All-Auth 教程)中獲得的“CustomUser”類,並且我將 user 作為每個模型中的外鍵,它按預期工作,僅顯示與當前登錄用戶有關的記錄到該特定用戶。

例如:

教育模型(在這里正確工作)

class Education(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    EducationInstitutionName = models.CharField(verbose_name=_('Institution Name'), max_length=100, default=None)
    EducationLevel = models.CharField(verbose_name=_('Education Level'), choices=EDUCATIONLEVEL, max_length=100, default=None)
    EducationStartDate = models.DateField(verbose_name=_('Education Start Date'), default=None)
    EducationEndDate = models.DateField(verbose_name=_('Education End Date'), default=None)
    EducationCaoCode = models.CharField(choices=CAO_CODE, max_length=100, default=None)
    EducationDesc = models.CharField(verbose_name=_('Education Description'), max_length=250, default=None)


    def __str__(self):
        return self.EducationInstitutionName

這完美地工作,我正在實現所需的東西。

當我有一個由外鍵組成的表時,問題就出現了,外鍵是我的應用程序的焦點,它采用 CV 的組成部分,並允許您將它們組合起來制作可互換部分的 CV。

CV MODEL(我只有由外鍵組成的模型)

class Cv(models.Model):
    user = models.ForeignKey(
        CustomUser,
        on_delete=models.CASCADE,
    )
    CvName = models.CharField(verbose_name=_('CvName'), max_length=100, default=None)
    CvEducation = models.ForeignKey(Education, on_delete=models.CASCADE)
    CvSkills = models.ForeignKey(Skills, on_delete=models.CASCADE)
    CvWorkExperience = models.ForeignKey(WorkExperience, on_delete=models.CASCADE)

    def __str__(self):
        return self.CvName

簡歷表格

這是我遇到問題的地方 - 我想過濾字段以僅顯示當前用戶的教育、技能和工作經驗的記錄 - 目前下拉列表顯示了教育、技能和工作經驗的所有記錄模型而不是僅與當前登錄用戶有關的模型。

class CvForm(forms.ModelForm):
    class Meta:
        model = Cv
        fields = ('CvName', 'CvEducation', 'CvSkills', 'CvWorkExperience')

# TRYING TO FILTER BY CURRENT USER
    def __init__(self, user, *args, **kwargs):
        super(CvForm, self).__init__(*args, **kwargs)
        print(user)
        self.fields['CvEducation'].queryset = Education.objects.filter(user=user)
        self.fields['CvSkills'].queryset = Education.objects.filter(user=user)
        self.fields['CvWorkExperience'].queryset = Education.objects.filter(user=user)


    def save(self, commit=True):
        cv = super(CvForm, self).save(commit=False)
        cv.user = self.request.user
        cv.CvName = self.cleaned_data['CvName']
        cv.CvEducation = self.cleaned_data['CvEducation']
        cv.CvSkills = self.cleaned_data['CvSkills']
        cv.CvWorkExperience = self.cleaned_data['CvWorkExperience']
        cv.save()
        return cv

CV LIST VIEW(這 - 正確 - 僅顯示與當前登錄用戶關聯的完整簡歷記錄)

class CvList(ListView):
    model = Cv
    fields = ['CvName', 'CvEducation', 'CvSkills', 'CvWorkExperience']
    success_url = reverse_lazy('Cv_list')

    def get_queryset(self):
        user_ids = CustomUser.objects.filter(username=self.request.user).values_list('id', flat=True)
        if user_ids:
            for uid in user_ids:
                return Cv.objects.filter(user__id=uid)
        else:
            return Cv.objects.all()

簡歷創建視圖

class CvCreate(CreateView):
    model = Cv
    fields = ['CvName', 'CvEducation', 'CvSkills', 'CvWorkExperience']
    success_url = reverse_lazy('Cv_list')

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super(CvCreate, self).form_valid(form)

    def get_queryset(self):
        user_ids = CustomUser.objects.filter(username=self.request.user).values_list('id', flat=True)
        if user_ids:
            for uid in user_ids:
                return Cv.objects.filter(user__id=uid)
        else:
            return Cv.objects.all()

這給了我...下拉列表顯示整個教育表而不是按當前用戶過濾

在這張圖片中,當我以John Doe 的身份登錄時,我應該看不到記錄 - “James Edu”,因為它與不同的用戶James相關聯。

這發生在我擁有外鍵的所有三個領域 - CvEducation、CvSkills 和 CvWorkExperience

最終修復(以一種非常迂回的方式):

表單初始化方法

 def __init__(self, *args, **kwargs):
        initial_arguments = kwargs.get('initial', None)
        initial_arguments_list = list(initial_arguments.values())
        user_id = initial_arguments_list[0]
        super(CvForm, self).__init__(*args, **kwargs)
        self.fields['CvEducation'].queryset = Education.objects.filter(user__id=user_id)
        self.fields['CvSkills'].queryset = Skills.objects.filter(user__id=user_id)
        self.fields['CvWorkExperience'].queryset = WorkExperience.objects.filter(user__id=user_id)

創建視圖

class CvCreate(CreateView):
    model = Cv
    success_url = reverse_lazy('Cv_list')
    form_class = CvForm
    exclude = ['user']

    def get_initial(self):
        self.initial.update({ 'created_by': self.request.user.id })
        return self.initial

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM