2015-02-06 74 views
3

我需要一些幫助讓add_page函數正常工作。我對HTML很陌生,甚至對Django更新。我正在處理的這一章可以在這裏找到:http://www.tangowithdjango.com/book17/chapters/forms.html。目前我培訓相關文件看起來是這樣的:探戈與Django - 第8章 - 練習

Forms.py

from django import forms 
from rango.models import Page, Category 

class CategoryForm(forms.ModelForm): 
    name = forms.CharField(max_length=128, help_text="Please enter the category name.") 
    views = forms.IntegerField(widget=forms.HiddenInput(), initial=0) 
    likes = forms.IntegerField(widget=forms.HiddenInput(), initial=0) 
    slug = forms.CharField(widget=forms.HiddenInput(), required=False) 

    # An inline class to provide additional information on the form. 
    class Meta: 
     # Provide an association between the ModelForm and a model 
     model = Category 
     fields = ('name',) 


class PageForm(forms.ModelForm): 
    title = forms.CharField(max_length=128, help_text="Please enter the title of the page.") 
    url = forms.URLField(max_length=200, help_text="Please enter the URL of the page.") 
    views = forms.IntegerField(widget=forms.HiddenInput(), initial=0) 

    class Meta: 
     # Provide an association between the ModelForm and a model 
     model = Page 

     # What fields do we want to include in our form? 
     # This way we don't need every field in the model present. 
     # Some fields may allow NULL values, so we may not want to include them... 
     # Here, we are hiding the foreign key. 
     # we can either exclude the category field from the form, 
     exclude = ('category',) 
     #or specify the fields to include (i.e. not include the category field) 
     #fields = ('title', 'url', 'views') 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     url = cleaned_data.get('url') 

     # If url is not empty and doesn't start with 'http://', prepend 'http://'. 
     if url and not url.startswith('http://'): 
      url = 'http://' + url 
      cleaned_data['url'] = url 

     return cleaned_data 

Views.py:

from django.shortcuts import render 
from django.http import HttpResponse 
from rango.models import Category, Page 
from rango.forms import CategoryForm, PageForm 

def index(request): 
    # Query the database for a list of ALL categories currently stored. 
    # Order the categories by no. likes in descending order. 
    # Retrieve the top 5 only - or all if less than 5. 
    # Place the list in our context_dict dictionary which will be passed to the template engine. 
    category_list = Category.objects.order_by('-likes')[:5] 
    page_list = Page.objects.order_by('-view')[:5] 
    context_dict = {'categories': category_list, 
        'pages': page_list} 

    # Render the response and send it back! 
    return render(request, 'rango/index.html', context_dict) 

def category(request, category_name_slug): 

    # Create a context dictionary which we can pass to the template rendering engine. 
    context_dict = {} 

    try: 
     # Can we find a category name slug with the given name? 
     # If we can't, the .get() method raises a DoesNotExist exception. 
     # So the .get() method returns one model instance or raises an exception. 
     category = Category.objects.get(slug=category_name_slug) 
     context_dict['category_name'] = category.name 
     context_dict['category_name_slug'] = category_name_slug 

     # Retrieve all of the associated pages. 
     # Note that filter returns >= 1 model instance. 
     pages = Page.objects.filter(category=category) 

     # Adds our results list to the template context under name pages. 
     context_dict['pages'] = pages 
     # We also add the category object from the database to the context dictionary. 
     # We'll use this in the template to verify that the category exists. 
     context_dict['category'] = category 
    except Category.DoesNotExist: 
     # We get here if we didn't find the specified category. 
     # Don't do anything - the template displays the "no category" message for us. 
     pass 

    # Go render the response and return it to the client. 
    print context_dict 
    return render(request, 'rango/category.html', context_dict) 

def add_category(request): 
    # A HTTP POST? 
    if request.method == 'POST': 
     form = CategoryForm(request.POST) 

     # Have we been provided with a valid form? 
     if form.is_valid(): 
      # Save the new category to the database. 
      form.save(commit=True) 

      # Now call the index() view. 
      # The user will be shown the homepage. 
      return index(request) 
     else: 
      # The supplied form contained errors - just print them to the terminal. 
      print form.errors 
    else: 
     # If the request was not a POST, display the form to enter details. 
     form = CategoryForm() 

    # Bad form (or form details), no form supplied... 
    # Render the form with error messages (if any). 
    return render(request, 'rango/add_category.html', {'form': form}) 

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() 
       # probably better to use a redirect here. 
       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) 

urls.py

from django.conf.urls import patterns, url 
from rango import views 

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

我認爲這^是我我遇到了這個問題。我設法進入「添加頁面」屏幕,但是當我嘗試提交某些內容時,我收到一個錯誤,指出我只提供1個參數,add_page()需要2個。我想我可能需要一個額外的url類似於「add_category」的URL,但這必然意味着其他URL指向了錯誤的地方?

category.html

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Rango</title> 
    </head> 

    <body> 
     <h1>{{ category_name }}</h1> 
     {% if category %} 
      {% if pages %} 
      <ul> 
       {% for page in pages %} 
       <li><a href="{{ page.url }}">{{ page.title }}</a></li> 
       {% endfor %} 
      </ul> 

      {% else %} 
       <strong>No pages currently in category.</strong> 
      {% endif %} 
      <li><a href="/rango/category/{{ category_name_slug }}/add_page/">Add a New Page</a></li> 
     {% else %} 
      The specified category {{ category_name }} does not exist! 
     {% endif %} 
    </body> 
</html> 

add_page.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Rango</title> 
    </head> 

    <body> 
     <h1>Add a Page</h1> 

     <form id="page_form" method="post" action="/rango/add_page/"> 

      {% 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="Create Page" /> 
     </form> 
    </body> 

</html> 
+0

請發佈add_page.html模板,並刪除不相關的category.html以及除add_page之外的所有視圖。 – 2015-02-06 18:35:18

+0

我認爲category.html是相關的,因爲我對它進行了修改。我已經添加了add_page.html – 2015-02-06 18:51:02

+0

您已將表單發佈到/ rango/add_page /,而不是/ category/whatever/add_page /,因此您必須具有另一個對此作出響應的urls.py條目:在哪裏?你可以發佈嗎? – 2015-02-06 19:07:59

回答

2

我編輯的add_page功能包括category_name_slug:

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() 
       # probably better to use a redirect here. 
       return category(request, category_name_slug) 
     else: 
      print form.errors 
    else: 
     form = PageForm() 

    # made the change here 
    context_dict = {'form':form, 'category': cat, 'category_name_slug': category_name_slug} 

    return render(request, 'rango/add_page.html', context_dict) 

然後我編輯的add_page.html看像這樣:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Rango</title> 
    </head> 

    <body> 
     <h1>Add a Page</h1> 

     <form id="page_form" method="post" action="/rango/category/{{ category_name_slug }}/add_page/"> 

      {% 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="Create Page" /> 
     </form> 
    </body> 

</html> 
+0

感謝分享。對'add_page.html'模板的修改不是那麼明顯。 – 2015-02-18 14:23:55

0

,如果你不想要編輯您的views.py

只是DOIT

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Rango</title> 
    </head> 

    <body> 
     <h1>Add a Page</h1> 

     <form id="page_form" method="post" action="/rango/category/{{ category }}/add_page/"> 

      {% 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="Create Page" /> 
     </form> 
    </body> 

</html> 

但我有問題,它仍然無法在數據庫保存。