2013-04-09 96 views
0

我是python以及Django的新手,並且我已經開始了一個示例項目「blog」。Python和Django博客示例項目

當前博客文章是手動添加到數據庫中,但我想通過向用戶提供表單在前端完成。我創建了我的model.pyviews.py文件,但我無法在前端看到這些字段。我抄的是我下面的代碼:

models.py

class posts(models.Model): 
    author = models.CharField(max_length = 30) 
    title = models.CharField(max_length = 100) 
    bodytext = models.TextField() 
    timestamp = models.DateTimeField() 

class postForm(ModelForm): 
    class Meta: 
     model = posts 

views.py

def home(request): 
    content = posts.objects.all()[:5] 
    return render_to_response('index.html',{'posts' : content}) 

def save_blog(request):  
    form = postForm 
    if request.POST: 
     form = postForm(request.POST) 
     if form.is_valid(): 
      form.save 
    return render_to_response('index.html',{'form' : form},context_instance=RequestContext(request)) 

url.py

from django.conf.urls import patterns, include, url  
from django.contrib import admin 
admin.autodiscover() 

urlpatterns = 
    patterns('', 
     url(r'^$', 'blog.views.home', name='home'), 
     url(r'^admin/', include(admin.site.urls)) 
    ) 

的index.html

<body> 
    <div class="container"> 
     <h1>Welcome To</h1> 
     <hr /> 
     {% for post in posts %} 
      <div class="posts"> 
       <h2>{{ post.title }}</h2> 
       <h3>Posted on {{ post.timestamp }} by {{ post.author }}</h3> 
       <p>{{ post.bodytext }}</p> 
      </div> 
      <hr /> 
     {% endfor %} 
    </div> 
    <div class="forms"> 
     <form action="." method="post" name="posts" id="posts">{% csrf_token %} 
     <table> 
     <tr><td>{{form.author.label}}</td><td>{{form.author}}</td></tr> 
     <tr><td>{{form.title.label}}</td><td>{{form.title}}</td></tr> 
     <tr><td>{{form.bodytext.label}}</td><td>{{form.bodytext}}</td></tr> 
     <tr><td></td><td><input type="button" name="btnSave" id="bntSave" value="Submit" class = "default2"/></td> 
     </table> 
     </form> 
    </div> 
</body> 

settings.MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
) 

請讓我知道,如果我缺少什麼。同時讓我知道如何在不使用Django模型的情況下實現這一點。

感謝

+0

如果你是新用戶,則必須在Python中使用spmething喜歡這名字的類。請參閱http://www.python.org/dev/peps/pep-0008/#class-names – 2013-04-09 08:02:44

+1

[在文檔中]明確給出了在視圖中使用表單的模式(https://docs.djangoproject的.com/EN/1.5 /主題/形式/#使用-A-形式-IN-A視圖)。你爲什麼不使用它? – 2013-04-09 08:43:55

回答

0

views.py

def home(request): 
    content = posts.objects.all()[:5] 
    form = postForm() 
    if request.POST: 
     form = postForm(request.POST) 
     if form.is_valid(): 
      form.save() 
    return render_to_response('index.html',{'posts' : content, 'form' : form}, context_instance=RequestContext(request)) 

的index.html

<div class="forms"> 
    <form method="post" name="posts" id="posts"> 
     {% csrf_token %} 
     {{ form.as_table }} 
     <input type="button" name="btnSave" id="bntSave" value="Submit" class="default2"/> //<--------------- 
    </form> 
</div> 

UPDATE:

好吧,我現在看到了爲什麼它不提交。你把button,而不是submit輸入型

<input type="submit" name="btnSave" id="bntSave" value="Submit" class="default2"/> //<--------------- 

就在您的時間戳字段添加auto_now_add

timestamp = models.DateTimeField(auto_now_add=True) 
+0

我覺得只是修復人的代碼並不能真正幫助他們,特別是沒有解釋。 ..我認爲這會讓事情變得更糟(至少對我來說是這樣),因爲他們最終會複製粘貼而不是完成它。 – Ngenator 2013-04-09 08:58:34

+0

感謝您的幫助。但它仍然沒有工作。 – Razer 2013-04-09 09:05:47

+0

我不想複製和粘貼,沒有什麼我要去學習如果我這樣做。所以請做出解釋。 – Razer 2013-04-09 09:09:53

0

看起來你叫你的形式postForm但用在你看來posts_form ...

我也不能確定什麼form_save是,你應該像

形式實例中調用 save()
if form.is_valid(): 
    form.save() 

發佈後,通常會將用戶重定向到另一個url以防止重新提交數據。

+0

模板仍然沒有顯示這些字段。 – Razer 2013-04-09 09:07:44

+0

@Razer你應該看看[Daniel Roseman]發佈的[link](https://docs.djangoproject.com/en/1.5/topics/forms/#using-a-form-in-a-view) ](http://stackoverflow.com/questions/15896109/python-and-django-blog-sample-project/15896170#comment22637421_15896109) – Ngenator 2013-04-09 09:18:09

+0

我想現在 任何人都可以告訴我這是什麼意思: 返回HttpResponseRedirect( '/ thanks /') 爲什麼感謝被/.../包圍,並且感謝一個html文件? – Razer 2013-04-09 09:21:57