Django在一个视图上有多种形式

Ric*_*oss 2 python forms django

我有一个Django模板,其中包含来自几种不同模型类型的数据组合而成。仪表板(如果需要)。每个都有一个编辑表单。

最好将所有这些表单发布回同一位置并通过如下所示的唯一字段来区分它们,从而在一个视图中对其进行处理?

或者,如果有许多不同的专用途径是前进的方向?感谢您的指导

class ProjectDetail(DetailView):

template_name = 'project/view.html'

def get_object(self):
    try:
        return Project.objects.filter(brief__slug=self.kwargs['slug']).filter(team=get_user_team(self.request)).first()
        # add loop to allow multiple teams to work on the same brief (project)
    except Exception as e:
        project_error = '%s (%s)' % (e.message, type(e))
        messages.error(self.request, 'OH NO! %s' % project_error)
        return redirect('home')

def get_context_data(self, **kwargs):
    project = self.get_object()
    context = dict()
    context['project'] = project
    context['milestone_form'] = MilestoneForm(initial={'project': project})
    context['view'] = self
    return context

def post(self, request, *args, **kwargs):
    # get the context for the page
    context = self.get_context_data()
    try:
        # switch for each of the form types on the team profile page (shown if member)
        if 'milestone_form_submit' in request.POST:
            project=self.get_object()
            # set date arbitrarily to half way to brief deadline
            brief = Brief.objects.get(project=project)
            last_milestone = self.milestones().last()
            milestone_del_date = last_milestone.del_date + timedelta(days=7)

            new_milestone = Milestone(
                                project=project,
                                title_text=request.POST.get('title_text'),
                                del_date=milestone_del_date,
                                )
            try:
                new_milestone.save()
                messages.success(self.request, "Excellent! New delivery popped on the bottom of the list")
            except Exception as e:
                # pass the erroring form back in the context if not
                form = MilestoneForm(request.POST)
                context['milestone_form'] = form
                messages.error(self.request, "OH NO! Deadline didn't save. Be a sport and check what you entered")

        elif 'milestone-edit-date-form-submit' in request.POST:
            # get object from db
            milestone = Milestone.objects.get(pk=request.POST['id'])
            # update del_date field sent
            milestone.del_date = request.POST['del_date']
            # save back to db
            milestone.save()
            messages.success(self.request, "Updated that delivery right there!")

        elif ...

    except Exception as e:
        messages.error(self.request, "OH NO! Deadline didn't save. Be a sport and check what you entered")
    return render(request, self.template_name, context)
Run Code Online (Sandbox Code Playgroud)

Adi*_*tov 5

您可以使用mixins来解决您的问题。

要点示例https://gist.github.com/michelts/1029336

class MultipleFormsMixin(FormMixin):
    """
    A mixin that provides a way to show and handle several forms in a
    request.
    """
    form_classes = {} # set the form classes as a mapping

    def get_form_classes(self):
        return self.form_classes

    def get_forms(self, form_classes):
        return dict([(key, klass(**self.get_form_kwargs())) \
            for key, klass in form_classes.items()])

    def forms_valid(self, forms):
        return super(MultipleFormsMixin, self).form_valid(forms)

    def forms_invalid(self, forms):
        return self.render_to_response(self.get_context_data(forms=forms))
Run Code Online (Sandbox Code Playgroud)

如您所见,当您从此类继承时,您可以同时处理多种形式。查看要点的代码,使其适应您的问题。

看这个答案