【问题标题】:How to change model argument in inlineformset_factory?如何更改 inlineformset_factory 中的模型参数?
【发布时间】:2020-04-14 18:44:45
【问题描述】:

一切都按照这个逻辑进行。有一个 Project 模型,其中包含有关项目的一般信息。许多用户可以参与此项目(模型 Employee)并执行他们的项目工作部分(模型 Work)。 我使用 inlineformset_factory 创建了一个用于编辑表单的视图。

forms.py

ProjectEditFormSet = inlineformset_factory(Project, Work,
                                       form=WorkCreateForm,
                                       extra=0)

models.py

class Work(models.Model):
    """On which projects an employee has worked."""

    employee = models.ForeignKey(
        Employee, on_delete=models.CASCADE, related_name='employee_projects')
    project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='project_work')
    start_year = models.CharField('work start year', max_length=4, default=datetime.datetime.now().year)
    start_month = models.CharField('work start month', max_length=10, default=datetime.datetime.now().month)
    end_year = models.CharField('work end year', max_length=4, default=datetime.datetime.now().year)
    end_month = models.CharField('work end month', max_length=10, default=datetime.datetime.now().year)
    responsibility = models.TextField("employee work responsibility", blank=True)
    technologies = models.ManyToManyField(
        Technology, verbose_name="technologies used on the project")

class Project(models.Model):
    """Project information."""

    name = models.CharField("project name", max_length=64)
    description = models.TextField("project description")

views.py

class WorkEditView(AuthorizedMixin, UpdateView):
    """
    Edit new project instances
    """
    model = Project
    form_class = ProjectForm
    template_name = 'work_edit.html'


    def get_context_data(self, **kwargs):
        context = super(WorkEditView, self).get_context_data(**kwargs)
        context['project_form'] = ProjectEditFormSet(instance=self.object)
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        project_form = WorkFormSet(self.request.POST, instance=self.object)
        if form.is_valid() and project_form.is_valid():
            return self.form_valid(form, project_form)
        else:
            return self.form_invalid(form, project_form)


    def form_valid(self, form, project_form):
        self.object = form.save()
        project_form.instance = self.object
        project_form.save()
        return redirect('{}#experience'.format(reverse('profile', kwargs={'pk': self.kwargs['employee']})))

它现在对我来说是如何工作的。

编辑时,显示所有与项目相关的工作表单(项目涉及的每个用户的表单)

我想得到什么结果

仅显示属于正在编辑其个人资料的当前用户的编辑表单。

urls.py

 path('work/<int:employee>/<int:pk>/edit/', WorkEditView.as_view(), name='work_info_edit'),

其中&lt;int:employee&gt; - 当前员工; &lt;int:pk&gt; - 项目编号

我觉得我需要改变

def get_context_data(self, **kwargs):
    context = super(WorkEditView, self).get_context_data(**kwargs)
    context['project_form'] = ProjectEditFormSet(instance=self.object)  <--Smth here need change ??????

但我找不到办法。

【问题讨论】:

  • 在实例化你的ProjectEditFormSet时覆盖queryset,如图here

标签: python django django-forms inline-formset


【解决方案1】:

与任何ModelFormSet 一样,您可以在实例化ProjectEditFormSet 时指定queryset 参数:

employee_id = self.kwargs['employee']
employee = Employee.objects.get_or_404(id=employee_id)
project_form = ProjecEditFormSet(request.POST, instance=self.object, 
    queryset=Work.objects.filter(employee=employee))

【讨论】:

    猜你喜欢
    • 2018-03-13
    • 2018-10-12
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2018-01-31
    • 1970-01-01
    相关资源
    最近更新 更多