首页 > 解决方案 > 如何使用 CreateView 过滤表单字段之一中的查询集值?

问题描述

我的任务是更改表单中一个字段的值(带有外键连接的下拉列表)。我需要排除用户已经拥有的技术价值。我使用 CreateView 和 ModelForm。

表格.py

class SkillCreateForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
       super(SkillCreateForm, self).__init__(*args, **kwargs)
       employee_current_technology = Technology.objects.filter(??? --- How can I get editing user pk ????-----)
       self.fields['technology'].queryset = Technology.objects.exclude(name__in=employee_current_technology)

我知道我可以以某种方式使用 kwarg 和 get_form_kwarg 值从 url 获取 pk,但我不知道该怎么做。

网址.py

   path('profile/<int:pk>/skill/create/', SkillCreateView.as_view(), name='skill_create'),

视图.py

class SkillCreateView(AuthorizedMixin, CreateView):
    """
    Create new course instances
    """
    model = Skill
    form_class = SkillCreateForm
    template_name = 'employee_info_create.html'

    def get_form_kwargs(self):
        kwargs = super(SkillCreateView, self).get_form_kwargs()
        Employee.objects.get(pk=self.kwargs['pk']) -->get me pk
        ????
        return kwargs

    .....

模型.py

class Employee(models.Model):
    """Employee information."""
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='employee')
    summary = models.TextField("summary", blank=True, default='')
    skills = models.ManyToManyField(
        Technology, through="Skill", verbose_name="skills", blank=True)


class Skill(models.Model):
    """Information about an employee's skills."""

    employee = models.ForeignKey(
        Employee, on_delete=models.CASCADE, related_name="employee_skills")
    technology = models.ForeignKey(Technology, on_delete=models.CASCADE)


class Technology(models.Model):
    """Technologies."""
    tech_set = models.ForeignKey(Skillset, on_delete=models.CASCADE, related_name="skillset")
    name = models.CharField('technology name', max_length=32, unique=True)
    group = models.ForeignKey(Techgroup, on_delete=models.CASCADE, related_name="group")

标签: djangodjango-modelsdjango-formsdjango-views

解决方案


pk您可以在表单中注入,例如:

class SkillCreateView(AuthorizedMixin, CreateView):
    """
    Create new course instances
    """
    model = Skill
    form_class = SkillCreateForm
    template_name = 'employee_info_create.html'

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs.update(employee_pk=self.kwargs['pk'])
        return kwargs

然后,您可以以如下形式更新查询集:

class SkillCreateForm(forms.ModelForm):

    def __init__(self, *args, employee_pk=None, **kwargs):
       super().__init__(*args, **kwargs)
       if employee_pk is not None:
           self.fields['technology'].queryset = Technology.objects.exclude(
               skill__employee_id=employee_pk
           )

推荐阅读