【问题标题】:merging a view with template view django将视图与模板视图 django 合并
【发布时间】:2015-08-13 00:26:33
【问题描述】:

我希望我主页的登录页面是一个带有输入的表单,并且用户可以输入内容。所以我遵循了几个教程,现在我有了这个:

views.py:

def create2(request): 
  if request.method =='POST':
    form = LocationForm(request.POST)
    if form.is_valid():   
      form.save()
      return HttpResponseRedirect('')
  else:
    form = LocationForm()

  args = {}
  args.update(csrf(request))
  args['form'] = form
  return render_to_response('location/index.html', args)

在我的 urls.py 中:

url(r'^$', 'core.views.create2'),

效果很好,如果我转到 127.0.0.1:8000,我会进入 index.html,当在输入中输入某些内容时,它会保存在数据库中。但是,我主页的旧部分看起来像这样

class LandingView(TemplateView):
    model = Location
    template_name="location/index.html"
    def search
    ...

和 urls.py: url(r'^$', core.views.LandingView.as_view(), name='index'),

它有一个函数search 我所以我的问题是,有没有办法可以将def create2 合并到我的LandingView 中。我尝试了几件事,但我总是在没有输入字段的情况下拥有 index.html。我也试过了

def create2 
...
def search
...

但是没有用。

有谁知道如何将它们合并在一起?

编辑 谢谢你的工作解决方案现在看起来像这样

class Create(CreateView):
  model = coremodels.Location
  template_name = 'location/test.html'
  fields = ['title']
  def form_valid(self, form):
     form.save()
     return HttpResponseRedirect('')

    return super(Create, self).form_valid(form) 

【问题讨论】:

    标签: python django class merge function


    【解决方案1】:

    根据您正在寻找的结果,有多种方法可以解决此问题:

    1.使用CreateViewUpdateView

    Django 已经提供了一些类来为您的模型呈现表单,使用POST 提交它,如果表单验证不成功,则重新呈现带有错误的表单。

    查看generic editing views 文档。

    2。覆盖get_context_data

    LandingView 中,覆盖TemplateViewget_context_data 方法,以便您的上下文包含您在create2 中创建的表单。

    3.使用FormView

    如果您仍想使用自己定义的表单而不是CreateViewUpdateView 为您生成的模型表单,您可以使用FormView,它与TemplateView 几乎相同,除了它也自动处理您的表单提交/错误。


    在任何情况下,您都可以将 search 函数保留在基于类的视图中,并从 get_context_data 调用它以将其结果包含在模板的上下文中。

    【讨论】:

    • 如果我只是在一个类中编写 def create2,有什么方法可以通过 url 访问它吗?我试过 url(r'^$', 'core.views.LandingView.create2'),但没有用
    • 不,但是你可以让create2返回form而不是render_response,然后在get_data_context内部调用context['form'] = create2(self.request)
    • 太棒了!我正在使用 createView,非常感谢!我更新了我的代码
    • 所以我尝试了我的代码 if else 语句和没有但我看不出任何区别。我需要 else 语句吗?
    • 太棒了!我很高兴它对你有用! :) 在这种情况下,您不需要覆盖 form_validCreateView 会在提交时自动保存模型。只有当您需要一些额外的处理,或者您使用FormView 而不是CreateView 时,您才应该覆盖它。所以,现在你可以完全删除form_valid。要在提交表单后重定向,只需在您的视图中使用success_url(有一些示例here)。
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2018-11-24
    相关资源
    最近更新 更多