2015-06-09 44 views
2

前几天我已经决定学习Python/Django和使用它在我的私人项目的一种实践。我在builidng'polls'应用程序中完成了djangoproject教程1-6,现在我开始自己做了。以正确的方式的Python/Django的处理HTTP请求

简单的问题 - 我想查看,创建,编辑和删除“交易”的端点。

到目前为止,我已经中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结构。我可以在路线中只有/交易,然后分别使用不同的模板实现所有方法GET/POST/PUT/DELETE吗?我会在indexView中做到这一点,只有在其他视图内打印表格?只是觉得我不适合在/创建POST方法,或者我是否会过度使用这个方法。

任何反馈将不胜感激。

+3

如果你想有一个REST API,你可能希望使用django-rest-framework或不安分。否则,而不是浪费你的时间与Django的“GenericViews”只是写你自己的做正确的事情。 –

+0

感谢您的提示。我已经意识到'GenericViews'不是一个好的选择,简单的功能与ModelForm相结合对于我想要构建的接口来说要好得多.REST API可能是完全不同的故事,当我到达那里时我会穿过那座桥。 – irwin

回答

0

我意识到最好使用基于功能的方法与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']