2017-02-03 76 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+,因为系统读取\早在\\所以我把它。

这就是它应该如何工作。没有理由拿出任何东西。

相关问题