链接视图和在它们之间传递数据的最佳方法是什么?

时间:2016-12-28 16:23:43

标签: python django django-views

我有一个基本的日记应用程序,它有两个视图:添加和编辑视图。当用户点击添加'按钮添加视图,数据保存到数据库中,显示简单信息。当用户点击“更新”时编辑视图上的按钮,数据已更新,并添加了最后一个更新标记。

到目前为止,这些观点独立运行。默认情况下,“编辑视图”会加载上次保存的条目,并允许更新该条目。

我想更新它,以便在添加视图上成功添加新日记条目后,它会转换到编辑视图,以允许用户根据需要进行编辑和更新。如何将视图链接在一起并将相关数据传递给编辑视图以了解要获取哪个条目(数据库对象)进行编辑?此外,我希望能够独立使用编辑视图来获取指定的日记条目,例如在GET上。因此,编辑视图与任何调用它的人无关,它只知道要加载哪个日记条目。

现在添加和编辑视图的代码如下所示:

def addEntry(request):
   entryForm = None

   if request.method == "POST":
       entryForm = EntryForm(request.POST)

       if entryForm.is_valid():
           entryForm.save(commit = True)
           request.method = "GET"
           return entrySubmitted("Entry has been submitted")
       else:
           logger.info(entryForm.errors)
    else:    
        # Set up view with new entry form
        entryForm = EntryForm()

    template = getEntryViewTemplate(entryForm)

    return render(request, "DiaryEntry.html", template)



def editEntry(request):
   # Get the latest entry from the database
   entry = Entry.objects.last();

   if request.method == 'GET':
       entryForm = EntryForm(instance = entry)
   else:
       entryForm = EntryForm(request.POST, instance = entry)
       if entryForm.is_valid():
           entryForm.setLastUpdated(datetime.now())
           entryForm.save(commit = True)

   templateData = getEntryViewTemplate(entryForm)
   return render(request, "EditEntry.html", templateData)

先谢谢,

弗朗西斯

1 个答案:

答案 0 :(得分:0)

查看有关Class Base View的django文档。

https://docs.djangoproject.com/en/1.10/topics/class-based-views/intro/#

您可以使用不同的方法创建一个类。 获取,发布(创建对象),放置(更新对象)

你有很多有用的方法和属性。 例如,您可以将班级视图链接到特定模型(条目)。 https://docs.djangoproject.com/fr/1.10/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_queryset

如何将视图链接在一起并将相关数据传递给编辑视图以了解要获取哪个条目(数据库对象)进行编辑? 您需要传递ID对象进行编辑。两种解决方案在您的Post数据中。或者通过你的网址中的参数。 http://your_web_site.com/entry/id_entry/ 然后使用条目数据初始化表单

在您的网址django中,您可以链接到您的班级基本视图的网址。

    url(r'^entry/$', views.EntryView.as_view(), name='create_entry'),
    url(r'^entry/(?P<pk>[-\w/]+)$', views.EntryView.as_view(), name='update_entry'),

我希望这会对你有所帮助