首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python/Django以正确的方式处理HTTP请求

问Python/Django以正确的方式处理HTTP请求
EN

Stack Overflow用户
提问于 2015-06-09 13:54:19
回答 1查看 272关注 0票数 2

几天前,我决定学习Python / Django,并在我的一个私人项目中使用它。我已经做了djangoproject教程1-6在构建‘民意测验’应用程序,现在转到做的事情,我自己。

简单的问题-我想要一个端点来查看,创建,编辑和删除‘交易’。

到目前为止,我在views.py中有以下内容

代码语言:javascript
复制
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是这样的:

代码语言:javascript
复制
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方法是不对的,或者我想得太多了。

如有任何反馈,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-16 23:07:08

我意识到在ModelForm中使用基于功能的方法比使用GenericViews更好。使用表单验证工作的更新代码如下所示:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
from django.forms import ModelForm
from .models import Deal

class DealForm(ModelForm):
    class Meta:
        model = Deal
        fields = ['title', 'url']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30734132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档