2017-02-03 82 views
-1

我很新的Python和我建立在Django一個基本的博客。我試圖啓用個人博客帖子的編輯。我必須'獲取'這些個人博客帖子,以便我可以編輯它們。到目前爲止,系統並不喜歡我的'.get'方法,並向我展示了一個ValueError。我試圖將值類型更改爲int,str,float,甚至是複雜的。這一切或者返回相同的或者說它不喜歡'id'或甚至'pk',如果我改變它。更改值類型不改變ValueError異常無效基數爲10字面INT():「」

這是代碼。

views.py

from django.shortcuts import render 
from blogs.models import BlogPost 
from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 
from .forms import PostForm 




def index(request): 
    """The home page for blogs""" 
    blogposts = BlogPost.objects.order_by('date_added') 
    context = {'blogposts': blogposts} 
    return render(request, 'blogs/index.html', context) 



def blogpost(request, blogpost_id): 
    """Show a single post""" 
    postings = BlogPost.objects.get(id=blogpost_id) 
    context = {'postings': postings} 
    return render(request, 'blogs/blogpost.html', context) 


def new_post(request): 
    """Writ a new post to the blog""" 
    if request.method != 'POST': 
     # No data submitted; create a blank form. 
     form = PostForm() 
    else: 
     # POST data submitted; process data 
     form = PostForm(data=request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect(reverse('blogs:index')) 

context = {'form': form} 
return render(request, 'blogs/new_post.html', context) 


def edit_entry(request, entry_id): 
    """Edit an existing entry""" 
    entry = BlogPost.objects.get(id=entry_id) 

    if request.method != 'POST': 
     # Initial request; pre-fill form with the current entry 
     form = PostForm(instance=entry) 

else: 
    # POST data submitted; process data 
    form = PostForm(instance=entry, data=request.POST) 
    if form.is_valid(): 
     form.save() 
     return HttpResponseRedirect(reverse('blogs:blogpost', args[entry_id])) 

context = {'entry': entry, 'form': form} 
return render(request, 'blogs/edit_entry.html', context) 

如果你會發現,在高清博文(請求,blogpost_id):,我能夠採用不用彷徨方法完全相同的方式,它是成功的。更重要的是,.get應該像int一樣工作,因爲鏈接是一個整數。

models.py

from django.db import models 


class BlogPost(models.Model): 
    """A blog post""" 
    title = models.CharField(max_length=200) 
    text = models.TextField() 
    date_added = models.DateTimeField(auto_now_add=True) 



    def __str__(self): 
     """Return a string rep of model""" 
     return (str(self.title + "  : " + self.text)) 

urls.py

"""URL Configs for app blogs""" 
from django.conf.urls import url 
from blogs import views 



urlpatterns = [ 

    #Home page 
    url(r'^$', views.index, name='index'), 


    #Individual Postings Pages 
    url(r'^(?P<blogpost_id>\d+)/$', views.blogpost, name='blogpost'), 


    #New Post Page 
    url(r'^new_post$', views.new_post, name='new_post'), 

    #Page for editing a post 
    url(r'^edit_entry/(?P<entry_id>)/$', views.edit_entry, name='edit_entry'), 

]

對於

(?P<entry_id>)/$',我確實取出部,\ d +,因爲系統將'\'讀回爲'\\',所以我也是如此知道了。

forms.py

from django import forms 
from .models import BlogPost 


class PostForm(forms.ModelForm): 
    class Meta: 
     model = BlogPost 
     fields = ['text'] 
     labels = {'text':''} 
     widgets = {'text': forms.Textarea(attrs={'cols':80})} 

我能做些什麼來隔離並獲得具體崗位對它們進行編輯?

由於任何人誰回答這個,提前。

============================================== ==========================

@Alasdair 我沒有添加\ d +的網址,這就是我收到...

Page not found (404) 
Request Method: GET 
Request URL: http://127.0.0.1:8000/edit_entry// 
Using the URLconf defined in blog.urls, Django tried these URL patterns, in this order: 
^admin/ 
^ ^$ [name='index'] 
^ ^(?P<blogpost_id>\d+)/$ [name='blogpost'] 
^ ^new_post$ [name='new_post'] 
^ ^edit_entry/(?P<entry_id>\d+)/$ [name='edit_entry'] 
The current URL, edit_entry//, didn't match any of these. 
You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page. 

此外,當我這樣做,它會改變個人博客文章的行爲。我獲得原來的職位的詳細視圖的這種反應:

Exception Type:  NoReverseMatch 

Reverse for 'edit_entry' with arguments '('',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['edit_entry/(?P<entry_id>\\d+)/$'] 

{% block content %} 

<p>This is supposed to be for one post</p> 

<p>{{ postings }}</p> 



<p>Edit entry:</p> 
<a href="{% url 'blogs:edit_entry' entry_id %}">edit entry</a> 

{% endblock content %} 
+1

您應該使用'(?P \ d +)'來捕獲條目ID。如果您遇到錯誤,請將其全部包含在內。 – Alasdair

+0

@Alasdair感謝您的回覆。我這樣做,這是我得到的錯誤:'找不到頁面(404) 請求方法:\t GET 請求URL:\t http://127.0.0.1:8000/edit_entry// 使用博客中定義的URLconf。 Django按以下順序嘗試了這些網址格式: ^^edit_entry /(?P \ d +)/ $ [name ='edit_entry'] 當前網址edit_entry //與這些網址中的任何一個都不匹配。 你看到這個錯誤,因爲你的Django設置文件中有DEBUG = True。將其改爲False,Django將顯示一個標準的404頁面。' – blackwidow

+0

您的網址應該是 'URL(R '^ edit_entry /(ΔP \ d +)/ $',views.edit_entry,名稱= 'edit_entry')' 您是在看到404錯誤'/ edit_entry //'因爲這不是有效的網址。它應該像'/ edit_entry/1 /'('1'是帖子的ID) –

回答

1

你得到的異常消息是因爲你正在試圖解析空字符串作爲整數int("")。那個操作沒有意義。網址中的ID模式應至少包含一個字符。

(?P<entry_id>)是完全無用的模式,因爲它不包含字符。它將始終匹配空字符串''並將其傳遞給您的查看功能。

(?P<entry_id>)/$,我也拿出一部分,\d+,因爲系統讀取\早在\\所以我把它。

這就是它應該如何工作。沒有理由拿出任何東西。

相關問題