實戰Django:Rango Part3

 

這一節咱們將要給Rango項目設計兩個表單:添加分類表單和添加頁面表單。html

14.Part2練習答案數據庫


咱們先來建立about視圖,編輯rango/views.py文件,在文件尾部加入以下內容:django

rango/views.py:瀏覽器

def about(request):return render(request,'rango/about.html')

接下來在templates/rango文件夾下新建一個about.html文件,加入以下內容:ide

rangoproject/templates/rango/about.html函數

<!DOCTYPE html><html><head><title>Rango</title></head><body><h1>關於Rango</h1>歡迎訪問Rango!<br/>這是一張Rango的圖片!<br/>{% load static %}<img src="{% static "rango.jpg" %}" alt="Rango" /></body></html>

隨後編輯rango/urls.py文件,把urlpatterns部分變成這樣:post

rango/urls.py:ui

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^category/(?P<category_name_slug>[\w\-]+)/$', views.category, name='category'),
    url(r'^about/$', views.about, name='about'),
)

最後別忘了給index.html加上一個「關於」的連接,在</body>前插入這樣一行代碼:url

rangoproject/templates/rango/index.htmlspa

<a href="/rango/about/">關於</a><br/>

去瀏覽器裏刷一下首頁,看下效果吧!

15.建立分類表單


咱們須要讓用戶能夠提交頁面和分類的信息,要完成這項功能,能夠藉助Django強大的表單處理功能。

首先在rango文件夾下建立一個forms.py文件,加入以下內容:

rango/forms.py:

from django import formsfrom rango.models import Page, Categoryclass CategoryForm(forms.ModelForm):
    name = forms.CharField(max_length=128, help_text="請輸入分類名稱:")
    views = forms.IntegerField(widget=forms.HiddenInput(), initial=0)
    likes = forms.IntegerField(widget=forms.HiddenInput(), initial=0)
    slug = forms.CharField(widget=forms.HiddenInput(), required=False)# 下面這個子類提供給表單一些額外的信息.class Meta:# 指定當前類關聯到哪一個模型,使用哪些字段model = Category
        fields = ('name',)class PageForm(forms.ModelForm):
    title = forms.CharField(max_length=128, help_text="請輸入頁面標題:")
    url = forms.URLField(max_length=200, help_text="請輸入頁面連接:")
    views = forms.IntegerField(widget=forms.HiddenInput(), initial=0)class Meta:# 指定關聯到Page模型model = Page# 咱們的表單中須要哪些字段?# 下面這個方法告訴咱們,不須要選擇每個字段,# 有些字段容許使用空值,因此咱們能夠把它排除掉,# 好比說category字段,咱們直接把它排除掉exclude = ('category',)#或者咱們直接填寫想要用到的字段(除了category字段),象下面這樣寫:#fields = ('title', 'url', 'views')

隨後咱們來建立一個叫add_category的視圖,編輯rango/views.py 文件,先在文件頭部插入一行代碼:

rango/views.py

from rango.forms import CategoryForm

再添加以下內容:

rango/views.py

def add_category(request):# 檢測是否用POST方法提交的if request.method == 'POST':
        form = CategoryForm(request.POST)# 提交的表單是否有效的?if form.is_valid():# 將這個新分類存入數據庫.form.save(commit=True)# 調用index()視圖.# 頁面將跳轉到首頁.return index(request)else:# 若表單包含錯誤,則在終端顯示錯誤信息.print(form.errors)else:# 若是不是用POST方法提交,則顯示錶單,供用戶輸入信息.form = CategoryForm()return render(request, 'rango/add_category.html', {'form': form})

接下來在templates/rango文件夾下新建一個add_category.html文件,加入以下內容:

rangoproject/templates/rango/add_category.html

<!DOCTYPE html><html><head><title>Rango</title></head><body><h1>添加分類</h1><form id="category_form" method="post" action="/rango/add_category/">{% csrf_token %}
            {% for hidden in form.hidden_fields %}
                {{ hidden }}
            {% endfor %}

            {% for field in form.visible_fields %}
                {{ field.errors }}
                {{ field.help_text }}
                {{ field }}
            {% endfor %}<input type="submit" name="submit" value="建立分類" /></form></body></html>

而後編輯rango/urls.py文件,把urlpatterns部分變成這樣:

rango/urls.py:

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^category/(?P<category_name_slug>[\w\-]+)/$', views.category, name='category'),
    url(r'^about/$', views.about, name='about'),
    url(r'^add_category/$', views.add_category, name='add_category'), 
)

最後一步,讓咱們給index.html加上一個「添加分類」的連接,在</body>前插入這樣一行代碼:

rangoproject/templates/rango/index.html

<a href="/rango/add_category/">添加分類</a><br />

看下效果,咱們先在分類名稱後面輸入「emagic」,再點擊」建立分類「按鈕,程序會自動跳轉回首頁,你能夠看到,」emagic」這個分類已經成功添加:

8

注意啊,若是你一次性添加多個分類,這些分類不必定會顯示在首頁上,由於咱們對首頁做了限制,最多隻能顯示5個分類。

 

Tips:關於中文分類名的添加

目前,當你添加中文分類名時,將沒法正常訪問對應的連接,這是因爲slugify函數不能對中文名稱進行別名處理,並且受Category模型的save函數限制,咱們也沒法在管理界面中手動修改別名。你能夠這樣作:

先修改Category模型的save函數,把它改成:

rango/models.py:

    def save(self, *args, **kwargs):if slugify(self.name):
            self.slug = slugify(self.name)
        super(Category, self).save(*args, **kwargs)

就是加一個判斷,只有在slugify(self.name)能將name轉換時,才使用slugify轉換過的別名,不然的話,使用你手工輸入的別名。

改完模型後,當你在表單中輸入中文分類時,只要在管理界面中手工修改別名,就可讓Rango支持中文分類名了。

 

16.建立頁面表單


咱們來添加一個叫add_page的視圖,編輯rango/views.py 文件,先在文件頭部插入一行代碼:

rango/views.py

from rango.forms import PageForm

再添加以下內容:

rango/views.py

def add_page(request, category_name_slug):try:
        cat = Category.objects.get(slug=category_name_slug)except Category.DoesNotExist:
        cat = None    if request.method == 'POST':
        form = PageForm(request.POST)if form.is_valid():if cat:
                page = form.save(commit=False)
                page.category = cat
                page.views = 0
                page.save()# 頁面跳轉到這裏更妥一些.return category(request, category_name_slug)else:print(form.errors)else:
        form = PageForm()

    context_dict = {'form':form, 'category': cat}    return render(request, 'rango/add_page.html', context_dict)

接下來在templates/rango文件夾下新建一個add_page.html文件,加入以下內容:

rangoproject/templates/rango/add_page.html

<!DOCTYPE html><html><head><title>Rango</title></head><body><h1>添加頁面</h1>
    {% if not category_name_url %}
        The specified category does not exist!<br/>{% else %}      <form id="page_form" method="post" action="/rango/category/`category_name_url`/add_page/">  {% csrf_token %}
          {% for hidden in form.hidden_fields %}
          {{ hidden }}
          {% endfor %}

          {% for field in form.visible_fields %}
          {{ field.errors }}<br/>  {{ field.help_text}}
          {{ field }}
          {% endfor %}          <br/>  <input type="submit" name="submit" value="建立頁面"/>  </form>{% endif %}                </body></html>

而後編輯rango/urls.py文件,把urlpatterns部分變成這樣:

rango/urls.py:

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^category/(?P<category_name_slug>[\w\-]+)/$', views.category, name='category'),
    url(r'^about/$', views.about, name='about'),
    url(r'^add_category/$', views.add_category, name='add_category'), 
    url(r'^category/(?P<category_name_slug>\w+)/add_page/$', views.add_page, name='add_page'),
)

最後一步,讓咱們給category.html加上一個「添加頁面」的連接,在</body>前插入這樣一行代碼:

rangoproject/templates/rango/category.html

<a href="/rango/category/{{ category_name_slug }}/add_page/">添加頁面</a><br/>

這樣,咱們就把添加頁面的表單作好了,你能夠打開任意一個分類,點擊「添加頁面」的連接,就能夠看到以下的效果:

1

 

 

【未完待續】

本文版權歸捨得學苑全部,歡迎轉載,轉載請註明做者和出處。謝謝!  
做者:捨得  
首發:捨得學苑@博客園

相關文章
相關標籤/搜索