2016-05-17 106 views
0

我是Django的新手,目前正在读一本书,Django by Example Antonio Mele。这是一个博客项目。试图扩展博客帖子应用以添加评论。我正在收到imprt错误。我无法导入在项目中创建一个模型都包含模型,视图,表单和追踪以下Django ImportError:无法导入名称评论

forms.py

from django import forms 
from django.db import models 
from blog.models import Comment 

class EmailPostForm(forms.Form): 
    name = forms.CharField(max_length=25) 
    email = forms.EmailField() 
    to = forms.EmailField() 
    comments = forms.CharField(required=False, widget=forms.Textarea) 

class CommentForm(forms.ModelForm): 
    class Meta: 
     model = Comment 
     fields = ('name', 'email', 'body') 

models.py

from django.db import models 
from django.utils import timezone 
from django.contrib.auth.models import User 
from django.core.urlresolvers import reverse 
from .forms import EmailPostForm, CommentForm 

# Create your models here. 
class PublishedManager(models.Manager): 
    def get_queryset(self): 
     return super(PublishedManager, self).get_queryset().filter(status='published') 



class Post(models.Model): 
    STATUS_CHOICES = (
      ('draft', 'Draft'), 
      ('published', 'Published'), 
      ) 
    title = models.CharField(max_length=250) 
    slug = models.SlugField(max_length=250, unique_for_date="publish") 
    author = models.ForeignKey(User, related_name='blog_posts') 
    body = models.TextField() 
    publish = models.DateTimeField(default=timezone.now) 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default="draft") 

    objects = models.Manager() 
    published = PublishedManager() 


    class Meta: 
     ordering = ('-publish',) 

    def __str__(self): 
     return self.title 

    def get_absolute_url(self): 
     return reverse('blog:post_detail', args=[self.publish.year, 
      self.publish.strftime('%m'), 
      self.publish.strftime('%d'), 
      self.slug]) 


class Comment(models.Model): 
    post = models.ForeignKey(Post, related_name='comments') 
    name = models.CharField(max_length=80) 
    email = models.EmailField() 
    body = models.TextField() 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    active = models.BooleanField(default=True) 

    class Meta: 
     ordering = ('created',) 

    def __str__(self): 
     return "Comment by {} on {}".format(self.name, self.post) 

意见.py

from django.shortcuts import render , get_object_or_404 
from blog.models import Post, Comment 
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 
from django.views.generic import ListView 
from django.core.mail import send_mail 
from blog.forms import CommentForm, EmailPostForm 

class PostListView(ListView): 
    queryset = Post.published.all() 
    context_object_name = 'posts' 
    paginate_by = 3 
    template_name = 'list.html' 


# Create your views here. 


def post_list(request): 
    posts = Post.objects.all() 
    object_list = Post.published.all() 
    paginator = Paginator(object_list,3) 
    page = request.GET.get('page') 
    try: 
     posts = paginator.page('page') 
    except PageNotAnInteger: 
     posts = paginator.page(1) 
    except EmptyPage: 
     posts = paginator.page(paginator.num_pages) 


    return render(request, 'list.html', {'posts': posts, 
             'page':page}) 



def post_detail(request, year, month, day, post): 


    post = get_object_or_404(Post, slug=post, 
            status='published', 
            publish__year=year, 
            publish__month=month, 
            publish__day=day) 
    #list of active comments for this post 
    comments = post.comments.filter(active=True) 

    if request.method == 'POST': 
     # A comment was posted 
     comment_form = CommentForm(data=request.POST) 
     if comment_form.is_valid(): 
      #create comment object but don't save to DB 
      new_comment = comment_form.save(commit=False) 
      # assitgn comment to post 
      new_comment.post = post 
      # save the comment to the DB 
      new_comment.save() 

    else: 
     comment_form =CommentForm() 

    args = {} 
    args.update(csrf(request)) 
    args['post'] = post 
    args['comment_form']= comment_form 
    args['comments'] = comments 



    return render(request, 'detail.html', args) 




def post_share(request,post_id): 
    # retrieve post by id 
    post = get_object_or_404(Post, id=post_id, status='published') 
    sent = False 

    if request.method == 'POST': 
     # form was submitted 
     form = EmailPostForm(request.POST) 
     if form.is_valid(): 
      # Forms fields passed validation# 
      cd = form.cleaned_data 


     post_url = request.build_absolute_uri(post.get_absolute_url()) 
     subject = '{} recommends you read "{}"'.format(cd['name'],post.title) 
     message = 'Read "{}" at {}\n\n{}\'s comments: {}'.format(post.title,post_url,cd['name'],cd['comments']) 

     send_mail(subject,message,'[email protected]',[cd['to']]) 




     sent=True 
    else: 

     form = EmailPostForm() 

    return render(request, 'share.html',{'post':post, 
             'form': form, 
             'sent': sent}) 

     return "Comment by {} on {}".format(self.name, self.post) 

回溯

(MySiteVirtualEnv) [email protected]:~/MySite/MySiteVirtualEnv/mysite# python manage.py makemigrations 
Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/root/MySite/MySiteVirtualEnv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line 
    utility.execute() 
    File "/root/MySite/MySiteVirtualEnv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 327, in execute 
    django.setup() 
    File "/root/MySite/MySiteVirtualEnv/local/lib/python2.7/site-packages/django/__init__.py", line 18, in setup 
    apps.populate(settings.INSTALLED_APPS) 
    File "/root/MySite/MySiteVirtualEnv/local/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate 
    app_config.import_models(all_models) 
    File "/root/MySite/MySiteVirtualEnv/local/lib/python2.7/site-packages/django/apps/config.py", line 202, in import_models 
    self.models_module = import_module(models_module_name) 
    File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/root/MySite/MySiteVirtualEnv/mysite/blog/models.py", line 5, in <module> 
    from .forms import EmailPostForm, CommentForm 
    File "/root/MySite/MySiteVirtualEnv/mysite/blog/forms.py", line 3, in <module> 
    from blog.models import Comment 
ImportError: cannot import name Comment 

回答

2

你正在尝试做一个圆形(循环)的进口。从您的models.py删除以下行:

from .forms import EmailPostForm, CommentForm 
+0

非常感谢您看过上一篇文章“Python循环导入?”但仍然无法理解这个理论或者改变什么:-) ....现在都在工作...... –

相关问题