在django中构建具有通用视图的仪表板

时间:2014-01-07 10:14:58

标签: django django-forms dashboard django-generic-views

我正在尝试构建一个仪表板,我有登录/注销部分,但有很多概念我仍然不太明白。就在这一刻,我正在努力建立这个:

  • 我有一个带有项目列表的仪表板(listview)。那些物品来自我建造的模型。要查看该仪表板,您需要登录(我已经具备此“登录”功能)。
  • 我需要将这些项目中的每一项链接到一个表单,我可以在其中更新这些项目的信息(updateview)。提交时,我想显示成功消息或错误消息。
  • 在仪表板中,我需要一个链接到createview表单的按钮。

这是一个应用程序,允许用户创建优惠,并在Facebook上作为Facebook应用程序在他们的粉丝中发布。

我遇到的问题是我不明白如何将视图,表单和网址放在一起以显示我想要的内容。

有什么我想念的吗?对不起,如果这个问题太愚蠢了。

我正在使用基于类的视图来构建它。这是我正在使用的代码:

在我的model.py中:

from django.db import models

from django.contrib.auth.models import User

# Create your models here.
class Offer(models.Model):
    offer_owner = models.ForeignKey(User, related_name="offers")
    created_at = models.DateTimeField(auto_now_add=True, editable=False)
    updated_at = models.DateTimeField(auto_now=True, editable=False)
    business_name = models.CharField(max_length=255, verbose_name="nombre de la empresa")
    offer_title = models.CharField(max_length=255, verbose_name="titulo de la oferta")
    offer_date_from = models.DateTimeField(null=True, blank=False, editable=True, auto_now_add=False, verbose_name="fecha en que inicia la oferta")
    offer_date_to = models.DateTimeField(null=True, blank=False, editable=True, auto_now_add=False, verbose_name="fecha en que finaliza la oferta")
    offer_detail = models.TextField(verbose_name="detalles de la oferta")
    offer_terms = models.TextField(verbose_name="terminos de la oferta")
    published = models.BooleanField(default=True, verbose_name="esta oferta esta publica")
    from_fanpage = models.CharField(max_length=255, verbose_name="nombre del fanpage") #fanpage info
    fanpage_id = models.BigIntegerField(verbose_name="fanpage id")
    fanpage_url = models.URLField(verbose_name="fanpage url")

    def __unicode__(self):
        return self.offer_title

from django.db import models from django.contrib.auth.models import User # Create your models here. class Offer(models.Model): offer_owner = models.ForeignKey(User, related_name="offers") created_at = models.DateTimeField(auto_now_add=True, editable=False) updated_at = models.DateTimeField(auto_now=True, editable=False) business_name = models.CharField(max_length=255, verbose_name="nombre de la empresa") offer_title = models.CharField(max_length=255, verbose_name="titulo de la oferta") offer_date_from = models.DateTimeField(null=True, blank=False, editable=True, auto_now_add=False, verbose_name="fecha en que inicia la oferta") offer_date_to = models.DateTimeField(null=True, blank=False, editable=True, auto_now_add=False, verbose_name="fecha en que finaliza la oferta") offer_detail = models.TextField(verbose_name="detalles de la oferta") offer_terms = models.TextField(verbose_name="terminos de la oferta") published = models.BooleanField(default=True, verbose_name="esta oferta esta publica") from_fanpage = models.CharField(max_length=255, verbose_name="nombre del fanpage") #fanpage info fanpage_id = models.BigIntegerField(verbose_name="fanpage id") fanpage_url = models.URLField(verbose_name="fanpage url") def __unicode__(self): return self.offer_title

在我的forms.py中:

from django import forms
from django.forms import ModelForm
from models import Offer, Consumer

# Login Form

#class LoginForm(forms.Form):
#   username = forms.EmailField()
#   password = forms.CharField(widget=forms.PasswordInput())

class OfferForm(ModelForm):
    class Meta:
        model = Offer
        exclude = ["offer_owner"]

class ConsumerForm(ModelForm):
    class Meta:
        model = Consumer
        # exclude = ["offer_obtained", ""]

在我的views.py中:

from django import forms from django.forms import ModelForm from models import Offer, Consumer # Login Form #class LoginForm(forms.Form): # username = forms.EmailField() # password = forms.CharField(widget=forms.PasswordInput()) class OfferForm(ModelForm): class Meta: model = Offer exclude = ["offer_owner"] class ConsumerForm(ModelForm): class Meta: model = Consumer # exclude = ["offer_obtained", ""]

在我的urls.py中:

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.template import RequestContext
from django.shortcuts import render_to_response, render
from django.core.exceptions import ObjectDoesNotExist
from django.views.generic import ListView
from django.views.generic.edit import UpdateView
from django.core.urlresolvers import reverse
from forms import *

from django import forms

from django.shortcuts import redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required

from .models import Offer

# forms
class LoginForm(forms.Form):
    username = forms.EmailField()
    password = forms.CharField(widget=forms.PasswordInput())

#view for the login
def login_usr(request):
    if request.method=="POST":
        form = LoginForm(request.POST)
        if form.is_valid():
            print "form is valid"
            # user registration or login
            username,pwd=request.POST.get("username",None),request.POST.get("password")
            if not username or not pwd:
                return HttpResponse("Username or password not present")
            try:
                user=User.objects.get(username=username)
            except ObjectDoesNotExist,ex:
                # print "Creating new user ..."
                print "error ..."
                return HttpResponse("No estas registrado en el sistema, registrate")
                # user=User.objects.create_user(username,username,pwd)
            if user:
                print "Authenticating ..."
                user=authenticate(username=username,password=pwd)
            print "Logging in user"
            login(request,user)
            return redirect("dashboard")

        else:
            print "form is not valid"
            return render_to_response("login.html", {'form':form}, RequestContext(request))
    else:
        return render_to_response("login.html", {'form':LoginForm()}, RequestContext(request))

def logout_usr(request):
    logout(request)
    return redirect("login")

#view for the dashboard
@login_required(login_url="/offers/login/")
def dashboard(request, *args, **kwargs):
    offer_list = Offer.objects.all()
    template_name = "dashboard.html"

    context = {
        "offer_list": offer_list
    }

    return render(request, template_name, context)

#view for the dashboard list of offers  
class OfferListView(ListView):
    model = Offer


#view for the dashboard's form detail from the list of offers
class OfferUpdateView(UpdateView):
    model = Offer
    form_class = OfferForm
    template_name = "offers_update_form.html"


# public view for the offer, this could be in a facebook canvas, or a public website that will be mobile or desktop.
@csrf_exempt
def app_public(request, pk, *args, **kwargs):
    offer = Offer.objects.get(pk=pk, published=True)
    template_name = "app_public.html"

    context = {
        "offer" : offer
    }
    return render(request, template_name, context)

from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt from django.template import RequestContext from django.shortcuts import render_to_response, render from django.core.exceptions import ObjectDoesNotExist from django.views.generic import ListView from django.views.generic.edit import UpdateView from django.core.urlresolvers import reverse from forms import * from django import forms from django.shortcuts import redirect from django.contrib.auth import authenticate, login, logout from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required from .models import Offer # forms class LoginForm(forms.Form): username = forms.EmailField() password = forms.CharField(widget=forms.PasswordInput()) #view for the login def login_usr(request): if request.method=="POST": form = LoginForm(request.POST) if form.is_valid(): print "form is valid" # user registration or login username,pwd=request.POST.get("username",None),request.POST.get("password") if not username or not pwd: return HttpResponse("Username or password not present") try: user=User.objects.get(username=username) except ObjectDoesNotExist,ex: # print "Creating new user ..." print "error ..." return HttpResponse("No estas registrado en el sistema, registrate") # user=User.objects.create_user(username,username,pwd) if user: print "Authenticating ..." user=authenticate(username=username,password=pwd) print "Logging in user" login(request,user) return redirect("dashboard") else: print "form is not valid" return render_to_response("login.html", {'form':form}, RequestContext(request)) else: return render_to_response("login.html", {'form':LoginForm()}, RequestContext(request)) def logout_usr(request): logout(request) return redirect("login") #view for the dashboard @login_required(login_url="/offers/login/") def dashboard(request, *args, **kwargs): offer_list = Offer.objects.all() template_name = "dashboard.html" context = { "offer_list": offer_list } return render(request, template_name, context) #view for the dashboard list of offers class OfferListView(ListView): model = Offer #view for the dashboard's form detail from the list of offers class OfferUpdateView(UpdateView): model = Offer form_class = OfferForm template_name = "offers_update_form.html" # public view for the offer, this could be in a facebook canvas, or a public website that will be mobile or desktop. @csrf_exempt def app_public(request, pk, *args, **kwargs): offer = Offer.objects.get(pk=pk, published=True) template_name = "app_public.html" context = { "offer" : offer } return render(request, template_name, context)

在我的模板中: 这是主视图,我在其中放置了项目列表

from django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

from offers.views import *

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'thesocialbrand.views.home', name='home'),
    # url(r'^thesocialbrand/', include('thesocialbrand.foo.urls')),
    url(r'^dashboard/', OfferListView.as_view(), name='dashboard'),
    url(r'^dashboard/edit/(?P<pk>\d+)/$', OfferUpdateView.as_view(), name="edit"),
    # url(r'^dashboard/(?P<pk>\d+)/$', dashboard_offer_detail),
    # url(r'^app/', app_public, name='app'),
    url(r'^app/(?P<pk>\d+)/$', app_public),
    url(r'^login/', login_usr, name='login'),
    url(r'^logout/', logout_usr, name='logout'),
)

from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: # from django.contrib import admin # admin.autodiscover() from offers.views import * urlpatterns = patterns('', # Examples: # url(r'^$', 'thesocialbrand.views.home', name='home'), # url(r'^thesocialbrand/', include('thesocialbrand.foo.urls')), url(r'^dashboard/', OfferListView.as_view(), name='dashboard'), url(r'^dashboard/edit/(?P<pk>\d+)/$', OfferUpdateView.as_view(), name="edit"), # url(r'^dashboard/(?P<pk>\d+)/$', dashboard_offer_detail), # url(r'^app/', app_public, name='app'), url(r'^app/(?P<pk>\d+)/$', app_public), url(r'^login/', login_usr, name='login'), url(r'^logout/', logout_usr, name='logout'), )

这是我的表单的更新视图的视图。单击列表中的某个项目后,我的表单的详细信息。

{% load url from future %}

<h1>Dashboard</h1>
<h4>Hola {{ user }}</h4>
<a href="/offers/logout/">Logout</a>
<h3>Mis ofertas</h3>
<ul>
    {% for offer in offer_list %}
    <li><a href="{% url 'edit' offer.pk %}">{{ offer.offer_title }}</a></li>
    {% empty %}
    <li>Sorry, no offers yet. Check back soon!</li>
    {% endfor %}
</ul>
当我完成这个时,我会在我的博客中写一篇文章,解释我发现的所有这些内容。对于处于同样情况的其他初学者来说,它肯定会有用,也许需要建立类似的东西。

0 个答案:

没有答案