簡體   English   中英

Python / Django以正確的方式處理HTTP請求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM