[英]Python/Django handling HTTP requests in the right way
几天前,我决定学习Python / Django,并在我的一个私人项目中练习使用它。 我已经在builidng'polls'应用程序中完成了djangoproject教程1-6,现在继续自己做某事。
简单的问题-我想要一个端点来查看,创建,编辑和删除“交易”。
到目前为止,我在views.py中有以下内容
from django.views import generic
from django.http import HttpResponseRedirect
from django.views.generic.edit import CreateView
from django.core.urlresolvers import reverse
from .models import Deal
class IndexView(generic.ListView):
context_object_name = 'latest_deals_list'
def get_queryset(self):
return Deal.objects.order_by('-created_date')[:10]
class DetailView(generic.DetailView):
model = Deal
class DealCreate(CreateView):
model = Deal
fields = ['title', 'url']
def post(self, *args, **kwargs):
title = self.request.POST["title"]
url = self.request.POST["url"]
try:
deal = Deal(tite=title, url = url)
deal.save()
except Exception as e:
print e
return HttpResponseRedirect(reverse('deals:detail', args=(deal.id,)));
和我的urls.py lokks一样:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
url(r'^create/$', views.DealCreate.as_view(), name='create')
]
一切正常,但是我正在努力了解如何将其组织成更简洁的类似于API的结构。 我能否仅在路由中使用/ deals,然后使用不同的模板分别实现所有方法GET / POST / PUT / DELETE? 我会在indexView中这样做,只在其他视图中打印表格吗? 在/ create中使用POST方法对我来说不合适,或者我对此是否考虑过多。
任何反馈将不胜感激。
我意识到最好在ModelForm中使用基于函数的方法,而不是在GenericViews中使用。 我更新的具有表单验证功能的代码如下所示:
from django.views import generic
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from .models import Deal
from .forms import DealForm
class IndexView(generic.ListView):
context_object_name = 'latest_deals_list'
def get_queryset(self):
return Deal.objects.order_by('-created_date')[:10]
class DetailView(generic.DetailView):
model = Deal
def add_model(request):
form = DealForm(request.POST or None)
if form.is_valid():
deal = form.save()
return HttpResponseRedirect(reverse('deals:detail', args=(deal.id,)));
return render(request, "deals/deal_form.html", {'form': form, 'title': 'Add New Deal'})
def update_model(request, pk):
deal = get_object_or_404(Deal, pk=pk)
form = DealForm(request.POST or None, instance=deal)
if form.is_valid():
deal = form.save()
return HttpResponseRedirect(reverse('deals:detail', args=(deal.id,)));
return render(request, "deals/deal_form.html", {'form': form, 'title': 'Editing "' + deal.title + '"'})
def delete_model(request, pk):
deal = get_object_or_404(Deal, pk=pk)
if request.method == 'POST':
deal.delete()
return HttpResponseRedirect(reverse('deals:index'));
return render(request, "deals/deal_confirm_delete.html", {'object': deal, 'title': 'Confirm deleting "' + deal.title + '"'})
urls.py:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
url(r'^create/$', views.add_model, name='create'),
url(r'^(?P<pk>[0-9]+)/edit/$', views.update_model, name='update'),
url(r'^(?P<pk>[0-9]+)/delete/$', views.delete_model, name='delete')
]
和forms.py:
from django.forms import ModelForm
from .models import Deal
class DealForm(ModelForm):
class Meta:
model = Deal
fields = ['title', 'url']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.