【问题标题】:How to Create a UpdateForm with TemplateView?如何使用 TemplateView 创建 UpdateForm?
【发布时间】:2018-09-07 14:02:29
【问题描述】:

我需要使用 TemplateView 创建一个 UpdateForm。为什么使用模板视图?因为,我有一个 geo_location 属性,并且我使用的是 LeafLet 地图,而 LeafLet 地图不适用于 generic.UpdateView 或其他相同类型的地图。

这是我对更新的看法:

class UpdateStore(LoginRequiredMixin, TemplateView):
    template_name = 'store_form'
    success_url = reverse_lazy('register:store_list')

    def post(self, request, *args, **kwargs):
        store_id = kwargs['store']
        store = get_object_or_404(Store, pk=store_id)
        form = StoreForm(request.POST, on_edit=True)

        if form.is_valid():
            form.save()
            return redirect(reverse('register:store_list'))
        else:
            context = self.get_context_data()
            context['data_form'] = form
            return render(request, self.template_name, context)

        return self.get(request)


    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        store_id = self.kwargs['store']
        store = get_object_or_404(Store, pk=store_id)

        data = {
            'name': store.name,
            'description': store.description,
            'address': store.address,
            'geo_loc': store.geo_loc,
            'opened': store.opened
        }

        context['editing'] = True
        context['data_form'] = StoreForm(initial=data, on_edit=True)
        context['store'] = store
        return context

这是我的模板代码:

{% extends 'base.html' %}
{% load bootstrap3 %}
{% load leaflet_tags %}

{% block extra_css %}
    {% leaflet_css plugins="forms" %}
{% endblock %}

{% block body %}

    <h1> Update Store </h1>

    <form method="POST">
        {% csrf_token %}

        {{ form }}

        {% buttons %}
        <button type="submit">
        {% bootstrap_icon "star" %} Save
        </button>
        {% endbuttons %}

    </form>

{% endblock %}

{% block extra_js %}
    {% leaflet_js plugins="forms" %}
{% endblock %}

我尝试了这个,但是在我的模板中,表单没有加载,并且我的模板是空白的 :(。有人知道为什么吗?我需要另一种方法来获取其他内容?

谢谢。

【问题讨论】:

  • 我个人觉得奇怪的是你不使用FormMixindocs.djangoproject.com/en/2.1/ref/class-based-views/…,它处理了Form本身的大部分工作流程。
  • LeafLet 地图不适用于 generic.UpdateView 或其他相同类型 你为什么这么说?我看不出 Django 视图如何影响传单地图。
  • 我从来没有听说过FormMixin ????。会尝试这个,但我尝试了其他方法,如 CreateView 和 ListView,并且传单不起作用。仅适用于 TemplateView
  • leaflet doesn't work 信息不足。为了让我们能够为您提供帮助,请展示一个简单、可重现的示例。
  • 在 CreateView 中,传单不起作用,地图不显示在模板中。而且,在 ListView 中,地图会显示,但不会显示带有该对象位置的图钉。

标签: django django-forms django-views django-class-based-views django-leaflet


【解决方案1】:

您的代码的问题是您将表单放在contextdata_form 键中:

context['data_form'] = StoreForm(initial=data, on_edit=True)

然后在模板上尝试使用{{form}} 而不是{{data_form}}。之后应该呈现表单。

【讨论】:

  • 好的,我知道了,但我试过了,现在我有了。 __call__() missing 1 required keyword-only argument: 'manager' :/
  • 这是与您的问题无关的代码问题。您确定您在data 上使用的store 字段都不是关系吗?例如,它可能缺少.all()
  • 这就是问题所在,当你应该传递查询集时,你正在将管理器传递给表单
  • 我该如何解决?你能帮帮我吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2016-12-27
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
  • 2011-10-15
相关资源
最近更新 更多