samedi 29 novembre 2014

python - débutant d'un seul modèle - nombreuses vues - django - Stack Overflow


I have managed (with a lot of assistance) to create a basic test blog in django 1.4.6 and python 2.7.


I can display the blog entries as a list (main page) and then allow the user to view each individual blog entry by clicking on the blog entry link.


I am now attempting to display the blog entries by author and by archive (by the published date of the blog entry).


Is it possible to have the one blog page that can list the blogs by date (most recent first), by author and by archive (by the date - most recent last)?


I am assuming the code is written in the urls.py and views.py files with the output to the single blog page, but I haven't yet found an example to work from and I can't quite figure this out on my own.


Here is my models.py:


class BlogPostDetails(models.Model, FillableModelWithLanguageVersion):
blog_post_title = models.CharField(max_length=50)
blog_post_date_published = models.DateField()
blog_post_author = models.CharField(max_length=25)
blog_post_body = models.TextField()
blog_post_allow_comments = models.BooleanField(default=False)
blog_post_timestamp_added = models.DateTimeField(auto_now_add=True, auto_now=False)
blog_post_timestamp_updated = models.DateTimeField(auto_now=True, auto_now_add=False)

def __unicode__(self):
return self.blog_post_title

class Meta:
ordering = ['-blog_post_date_published']
verbose_name = ('Blog')
verbose_name_plural = ('Blogs')

Here is my views.py:


def blog_post_item(request, blog_posts_id):
blog_posts = BlogPostDetails.objects.get(pk=blog_posts_id)
language_versions = get_language_versions(user=request.user)
return render(request, 'core/details/blog/blog_item.html', {
'blog_posts': blog_posts,
'display_default_language': display_default_language(request.user),
'languages': LANGUAGES,
'language_versions': language_versions,
'language_versions_num': len(language_versions),
})

def blog_post_list(request):
blog_posts = BlogPostDetails.objects.filter(blog_post_date_published__lt=datetime.today())
language_versions = get_language_versions(user=request.user)
return render(request, 'core/details/blog/blog_list.html', {
'blog_posts': blog_posts,
'display_default_language': display_default_language(request.user),
'languages': LANGUAGES,
'language_versions': language_versions,
'language_versions_num': len(language_versions),
})

Here is my urls.py


    url(r'^details/blog/blog_list/$', 'blog_post_list', name='blog_post_list'),
url(r'^details/blog/blog_item/(?P<blog_posts_id>\d+)/$', 'blog_post_item', name='blog_post_item'),



Some advices:



  1. You shouldn't use model name prefix in model field names, as you see code look much better:

    class BlogPost(models.Model, FillableModelWithLanguageVersion):
    title = models.CharField(max_length=50)
    date_published = models.DateField()
    author = models.CharField(max_length=25)
    body = models.TextField()
    allow_comments = models.BooleanField(default=False)
    timestamp_added = models.DateTimeField(auto_now_add=True, auto_now=False)
    timestamp_updated = models.DateTimeField(auto_now=True, auto_now_add=False)

    def __unicode__(self):
    return self.title

    class Meta:
    ordering = ['-date_published']
    verbose_name = ('Blog')
    verbose_name_plural = ('Blogs')

  2. Update django up to 1.6

  3. User class-based views(filtering and ordering example)


And yes - it is posible to use one template for you task


You should pass order type as url parameter.


url(r'^details/blog/blog_list/(?P<order_type>\w+)/$', 'blog_post_list', name='blog_post_list'),


def blog_post_list(request, order_type='date_published'):
blog_posts = BlogPost.objects.filter(date_published__lt=datetime.today()).order_by(order_type)
language_versions = get_language_versions(user=request.user)
return render(request, 'core/details/blog/blog_list.html', {
'blog_posts': blog_posts,
'display_default_language': display_default_language(request.user),
'languages': LANGUAGES,
'language_versions': language_versions,
'language_versions_num': len(language_versions),
})

If you want to use one url - the only way that i see is javascript on page ordering.



I have managed (with a lot of assistance) to create a basic test blog in django 1.4.6 and python 2.7.


I can display the blog entries as a list (main page) and then allow the user to view each individual blog entry by clicking on the blog entry link.


I am now attempting to display the blog entries by author and by archive (by the published date of the blog entry).


Is it possible to have the one blog page that can list the blogs by date (most recent first), by author and by archive (by the date - most recent last)?


I am assuming the code is written in the urls.py and views.py files with the output to the single blog page, but I haven't yet found an example to work from and I can't quite figure this out on my own.


Here is my models.py:


class BlogPostDetails(models.Model, FillableModelWithLanguageVersion):
blog_post_title = models.CharField(max_length=50)
blog_post_date_published = models.DateField()
blog_post_author = models.CharField(max_length=25)
blog_post_body = models.TextField()
blog_post_allow_comments = models.BooleanField(default=False)
blog_post_timestamp_added = models.DateTimeField(auto_now_add=True, auto_now=False)
blog_post_timestamp_updated = models.DateTimeField(auto_now=True, auto_now_add=False)

def __unicode__(self):
return self.blog_post_title

class Meta:
ordering = ['-blog_post_date_published']
verbose_name = ('Blog')
verbose_name_plural = ('Blogs')

Here is my views.py:


def blog_post_item(request, blog_posts_id):
blog_posts = BlogPostDetails.objects.get(pk=blog_posts_id)
language_versions = get_language_versions(user=request.user)
return render(request, 'core/details/blog/blog_item.html', {
'blog_posts': blog_posts,
'display_default_language': display_default_language(request.user),
'languages': LANGUAGES,
'language_versions': language_versions,
'language_versions_num': len(language_versions),
})

def blog_post_list(request):
blog_posts = BlogPostDetails.objects.filter(blog_post_date_published__lt=datetime.today())
language_versions = get_language_versions(user=request.user)
return render(request, 'core/details/blog/blog_list.html', {
'blog_posts': blog_posts,
'display_default_language': display_default_language(request.user),
'languages': LANGUAGES,
'language_versions': language_versions,
'language_versions_num': len(language_versions),
})

Here is my urls.py


    url(r'^details/blog/blog_list/$', 'blog_post_list', name='blog_post_list'),
url(r'^details/blog/blog_item/(?P<blog_posts_id>\d+)/$', 'blog_post_item', name='blog_post_item'),


Some advices:



  1. You shouldn't use model name prefix in model field names, as you see code look much better:

    class BlogPost(models.Model, FillableModelWithLanguageVersion):
    title = models.CharField(max_length=50)
    date_published = models.DateField()
    author = models.CharField(max_length=25)
    body = models.TextField()
    allow_comments = models.BooleanField(default=False)
    timestamp_added = models.DateTimeField(auto_now_add=True, auto_now=False)
    timestamp_updated = models.DateTimeField(auto_now=True, auto_now_add=False)

    def __unicode__(self):
    return self.title

    class Meta:
    ordering = ['-date_published']
    verbose_name = ('Blog')
    verbose_name_plural = ('Blogs')

  2. Update django up to 1.6

  3. User class-based views(filtering and ordering example)


And yes - it is posible to use one template for you task


You should pass order type as url parameter.


url(r'^details/blog/blog_list/(?P<order_type>\w+)/$', 'blog_post_list', name='blog_post_list'),


def blog_post_list(request, order_type='date_published'):
blog_posts = BlogPost.objects.filter(date_published__lt=datetime.today()).order_by(order_type)
language_versions = get_language_versions(user=request.user)
return render(request, 'core/details/blog/blog_list.html', {
'blog_posts': blog_posts,
'display_default_language': display_default_language(request.user),
'languages': LANGUAGES,
'language_versions': language_versions,
'language_versions_num': len(language_versions),
})

If you want to use one url - the only way that i see is javascript on page ordering.


0 commentaires:

Enregistrer un commentaire