简体   繁体   English

在自定义视图Django中使用Taggit

[英]Using Taggit with custom view Django

I am currently trying to implement a tag system into my Django project. 我目前正在尝试将标记系统实现到我的Django项目中。 I am trying to add the tags within each post, and have a category on the right hand side that displays maybe 10-20 of the tags. 我正在尝试在每个帖子中添加标签,并在右侧显示一个类别,该类别可能显示10-20个标签。 I am trying to implement this into the feed view, but i am unsure of how to call the slug for each tag in order to do /posts/tag/feed. 我正在尝试将其实现到供稿视图中,但是我不确定如何为每个标签调用该标签以便执行/ posts / tag / feed。 So once you click on a tag it will redirect to the slug of the tag. 因此,一旦您点击标签,它将重定向到标签的标签。 Which would make the tag clickable. 这将使标签可点击。 I tried to follow the link below but it only shows how to do it with the class view. 我尝试按照下面的链接进行操作,但仅显示了如何使用类视图进行操作。

https://godjango.com/33-tagging-with-django-taggit/ https://godjango.com/33-tagging-with-django-taggit/

views.py views.py

    def post_feed(request):
        if not request.user.is_staff or not request.user.is_superuser:
            raise Http404
            queryset_list = Post.objects.all()
            tags = Tag.objects.all()

            query = request.GET.get("q")
            if query:
                queryset_list = queryset_list.filter(
                Q(title__icontains=query)|
                Q(tags__icontains=query)|
                Q(description__icontains=query)|
                Q(user__first_name__icontains=query)|
                Q(user__last_name__icontains=query)
                ).distinct()
                paginator = Paginator(queryset_list, 5)
                page_request_var = "page"
                page = request.GET.get(page_request_var)
                try:
                    queryset = paginator.page(page)
                except PageNotAnInteger:
                    # If page is not an integer, deliver first page.
                    queryset = paginator.page(1)
                except EmptyPage:
                    # If page is out of range (e.g. 9999), deliver last page of results.
                    queryset = paginator.page(paginator.num_pages)

                    context = {
                    "object_list": queryset,
                    "title": "List",
                    "page_request_var": page_request_var,
                    }

        return render(request, "post_feed.html", context)

And here is my url 这是我的网址

url(r'^tag/(?P<slug>[-\w]+)/$', post_feed, name='tagged'),

the Tag.objects.all() only pulls up the tags but doesnt request the slugs. Tag.objects.all()仅提取标签,但不请求子弹。

I am unsure of how to add this to my view without changing it. 我不确定如何在不更改的情况下将其添加到我的视图中。

from django.views.generic import DetailView, ListView 从django.views.generic导入DetailView,ListView

from taggit.models import Tag 从taggit.models导入Tag

from .models import Product 从.models进口产品

taggit view to add url and query slug: taggit视图添加URL和查询段:

class TagMixin(object):
    def get_context_data(self, kwargs):
        context = super(TagMixin, self).get_context_data(kwargs)
        context['tags'] = Tag.objects.all()
        return context

class ProductDetail(DetailView):
    template_name = 'product/detail.html'
    context_object_name = 'product'
    model = Product


class ProductIndex(TagMixin, ListView):
    template_name = 'product/index.html'
    model = Product
    paginate_by = '10'
    queryset = Product.objects.all()
    context_object_name = 'products'

class TagIndexView(TagMixin, ListView):
    template_name = 'product/index.html'
    model = Product
    paginate_by = '10'
    context_object_name = 'products'

    def get_queryset(self):
        return Product.objects.filter(tags__slug=self.kwargs.get('slug'))

I have been stuck on this a few days. 这几天我被困住了。 Any advice would be helpful. 任何意见将是有益的。

Here is my models.py, sorry had to format it this way to show up as the whole models code. 这是我的models.py,很抱歉,必须以这种方式格式化它才能显示为整个模型代码。

            from django.db import models

            from django.db.models import Count, QuerySet, F
            from django.utils import timezone
            from django.conf import settings
            from django.contrib.contenttypes.models import ContentType
            from django.core.urlresolvers import reverse
            from django.db.models.signals import pre_save
            from django.utils.text import slugify
            from markdown_deux import markdown
            from django.utils.safestring import mark_safe
            from taggit.managers import TaggableManager

            from comments.models import Comment

            def upload_location(instance, filename):
                return "%s/%s" %(instance.slug, filename)


            class Post(models.Model):
                user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1 )
                title = models.CharField(max_length=75)
                slug = models.SlugField(unique=True)
                image = models.ImageField(
                        upload_to=upload_location,
                        null=True,
                        blank=True,
                        width_field="width_field",
                        height_field="height_field")
                height_field = models.IntegerField(default=0)
                width_field = models.IntegerField(default=0)
                description = models.TextField()
                tags = TaggableManager()
                public = models.BooleanField(default=False)
                updated = models.DateTimeField(auto_now_add=False, auto_now=True)
                created = models.DateTimeField(auto_now_add=True, auto_now=False)


                def __str__(self):
                    return self.title

                def get_absolute_url(self):
                    return reverse("posts:detail", kwargs={"slug": self.slug})

                class Meta:
                    ordering = ["-created", "-updated" ]

                def get_markdown(self):
                    description = self.description
                    markdown_text = markdown(description)
                    return mark_safe(markdown_text)

                @property
                def comments(self):
                    instance = self
                    qs = Comment.objects.filter_by_instance(instance)
                    return qs

                @property
                def get_content_type(self):
                    instance = self
                    content_type = ContentType.objects.get_for_model(instance.__class__)
                    return content_type


            def create_slug(instance, new_slug=None):
                    slug = slugify(instance.title)
                    if new_slug is not None:
                        slug = new_slug
                    qs = Post.objects.filter(slug=slug).order_by("-id")
                    exists = qs.exists()
                    if exists:
                        new_slug = "%s-%s" %(slug, qs.first().id)
                        return create_slug(instance, new_slug=new_slug)
                    return slug



            def pre_save_post_receiver(sender, instance, *args, **kwargs):
                if not instance.slug:
                    instance.slug = create_slug(instance)


            pre_save.connect(pre_save_post_receiver, sender=Post)

here is my template 这是我的模板

    <div class="row">
      <div class="col-sm-2">
         <div class="panel panel-primary">
          <div class="panel-heading">
            Tags
          </div>
          <div class="panel-body">
            <ul class="list-group">
              {% for tag in tags %}
                <li><a href="{% url 'tagged' tag.slug %}"></a></li>
              {% empty %}
                <li>No Tags</li>
              {% endfor %}
            </ul>
          </div>
        </div>
      </div>
    </div>


    <div class="container">
    <div class='col-sm-6 col-sm-offset-3'>
    <h1> Post Feed </h1>
    <form method='GET' action'' class='row'>
      <div class='col-sm-6'>
          <div class='input-group'>
              <input class='form-control' type='text' name='q' placeholder='Search posts' value='{{ request.GET.q }}'/>
              <span class='input-group-btn'>
              <input class= 'btn btn-default' type='submit' value='Search'/>
          </div>
      </div>
    </form>
    {% for obj in object_list %}
    <div class="row">
      <div class="col-sm-12">
        <div class="thumbnail">
          {% if obj.image %}
          <img src='{{ obj.image.url }}' class='img-responsive' />
          {% endif %}
          <div class="caption post-detail-item">
            <h3><a href='{{ obj.get_absolute_url }}'><strong>{{ obj.title }}</strong></a> <small>{{ obj.created|timesince }} ago</small>
            </h3>
            {% if obj.user.get_full_name %}<p>Poster: {{ obj.user.get_full_name }}</p>{% endif %}
            {{ obj.get_markdown|truncatechars_html:50 }}
            <p>Tags: {{ obj.tags|join:" | "|title }}</p>
            <p><a href="{{ obj.get_absolute_url }}" class="btn btn-primary" role="button">View</a></p>
          </div>
        </div>
      </div>
    </div>
    {% endfor %}

    <div class="pagination">
        <span class="step-links">
            {% if object_list.has_previous %}
                <a href="?{{ page_request_var }}={{ object_list.previous_page_number }}{% if request.GET.q %}&
                q={{ request.GET.q }}{% endif %}">previous</a>
            {% endif %}

            <span class="current">
                Page {{ object_list.number }} of {{ object_list.paginator.num_pages }}.
            </span>

            {% if object_list.has_next %}
                <a href="?{{ page_request_var }}={{ object_list.next_page_number }}&q={{ request.GET.q }}">next</a>
            {% endif %}
        </span>
    </div>

    <footer>
      <p class="pull-right"><a href="#">Back to top</a></p>
      <p>&copy; 2016 Holms, Inc. &middot; <a href='{% url "privacy" %}'>Privacy</a> &middot; <a href="#">Terms</a></p>
    </footer>
    </div>
    {% endblock content %}
    </div>

Just copy and paste these. 只需复制并粘贴这些内容即可。

Change the urls.py entry to this: 将urls.py条目更改为此:

url(r'^tag/(?P<pk>[-\w]+)/$', tag_list, name='tagged'),

Your post_feed function to this (views.py): 您的post_feed函数对此(views.py):

def post_feed(request):
    if not request.user.is_staff or not request.user.is_superuser:
        raise Http404
    queryset = Post.objects.all()
    query = request.GET.get("q")
    if query: # this is a separate variable (for searching I'm assuming)
        queryset_list = queryset_list.filter(
                Q(title__icontains=query)|
                Q(tags__icontains=query)| # I would consider taking this out. It's gonna cause problems.
                Q(description__icontains=query)|
                Q(user__first_name__icontains=query)|
                Q(user__last_name__icontains=query)
        ).distinct()
    # bring pagination/tag lookup outside of the if query block -- so you don't NEED a query
    paginator = Paginator(queryset, 5)
    page_request_var = "page"
    page = request.GET.get(page_request_var)
    try:
        queryset = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        queryset = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        queryset = paginator.page(paginator.num_pages)
    context = {
        "object_list": queryset,
        "tags": tags.objects.all()[0:20], # first 20 tags of all tags
        "title": "List",
        "page_request_var": page_request_var,
    }

    return render(request, "post_feed.html", context)

And your new function to show just posts based on a specific tag to this (views.py): 您的新功能仅显示基于特定标签的帖子(views.py):

""" modelled after the function above -- so it's easy to understand """
def tag_list(request, tag_id):
    if not request.user.is_staff or not request.user.is_superuser:
        raise Http404
    queryset = Post.objects.filter(tag__id=tag_id)
    paginator = Paginator(queryset, 5)
    page_request_var = "page"
    page = request.GET.get(page_request_var)
    try:
        queryset = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        queryset = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        queryset = paginator.page(paginator.num_pages)
    context = {
        "object_list": queryset,
        "tags": tags.objects.all()[0:20], # first 20 tags of all tags
        "title": "List",
        "page_request_var": page_request_var,
    }
    return render(request, "post_feed.html", context)

then change the template to (post_feed.html): 然后将模板更改为(post_feed.html):

<li><a href="{% url 'tagged' tag.pk %}">{{tag.name}}</a></li>

also, read this: https://docs.djangoproject.com/en/1.9/topics/http/urls/ 另外,请阅读以下内容: https : //docs.djangoproject.com/en/1.9/topics/http/urls/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM