【问题标题】:Django-taggit using choices select drop downDjango-taggit 使用选择下拉菜单
【发布时间】:2020-10-16 04:35:28
【问题描述】:

我试图弄清楚如何使用 Django-taggit 的选择来呈现下拉字段。

对于变量“类型”,如何在 Home.html 中传递类别(A、B、C)并将输入类型更改为选择?我认为它一定是这样的,并且以某种方式参考类别选择:

<select class="custom-select custom-select-sm">
    {% for num in form.fields.choices %}
        <option value="{{ num }}">{{ categories.choice(num) }}</option>
    {% endfor %}
</select>

模型.py

from django.db import models
from taggit.managers import TaggableManager

class Post(models.Model):
    categories=(
        ('A', 'A'),
        ('B', 'B'),
        ('C', 'C'),
    )
    type = models.CharField(max_length=250, choices=categories)
    title = models.CharField(max_length=250)
    description = models.TextField()
    published = models.DateField(auto_now_add=True)
    slug = models.SlugField(unique=True, max_length=100)
    tags = TaggableManager()

    def __str__(self):
        return self.title

forms.py

from django import forms
from .models import Post

categories=(
    ('A', 'A'),
    ('B', 'B'),
    ('C', 'C'),
)
                     
class PostForm(forms.ModelForm):
    type = forms.ChoiceField(choices=categories)
    class Meta:
        model = Post
        fields = [
            'type',
            'title',
            'description',
            'tags',
        ]

views.py

from django.shortcuts import render, get_object_or_404

from .models import Post
from .forms import PostForm

from taggit.models import Tag
from django.template.defaultfilters import slugify


def home_view(request):
    posts = Post.objects.all()
    common_tags = Post.tags.most_common()[:4]
    form = PostForm(request.POST)
    if form.is_valid():
        newpost = form.save(commit=False)
        newpost.slug = slugify(newpost.title)
        newpost.save()
        form.save_m2m()
    context = {
        'posts':posts,
        'common_tags':common_tags,
        'form':form,
    }
    return render(request, 'home.html', context)

主页.html

{% extends 'base.html' %}

{% block content %}
        <div class="container pt-5"> 
            <form method="POST">
                {% csrf_token %}
                <div class="form-group">
                    <label>Type</label>
                    <input type="text" class="form-control" name="type" placeholder="Add type">
                </div>
                <div class="form-group">
                    <label>Title</label>
                    <input type="text" class="form-control" name="title" placeholder="Add title">
                </div>
                <div class="form-group">
                    <label>Description</label>
                    <textarea type="text" class="form-control" name="description" placeholder="Add description"></textarea>
                </div>
                <div class="form-group">
                    <label>Tags</label>
                    <input type="text" data-role="tagsinput" class="form-control" name="tags">
                </div>
                <button type="submit" class="btn btn-primary">Submit</button>
            </form>
            <p>Common Tags: 
            {% for mt in common_tags %}
                <a href="#" class="badge badge-success">{{mt}}</a>
            {% endfor %}
            </p>
            <div class="row mb-2 posts">
                    {% for post in posts %}
                    <div class="col-md-6">
                        <div class="cards">
                            <div class="row no-gutters border rounded  flex-md-row mb-4 shadow-sm h-md-250">
                                <div class="col p-4 d-flex flex-column position-static">
                                    <h3 class="my-1"><a href="{% url 'detail' post.slug %}">{{post.title}}</a></h3>
                                    <div style="display:flex">
                                        {% for tag in post.tags.all %}
                                        <a href="{% url 'tagged' tag.slug %}" class="mr-1 badge badge-info">#{{ tag }}</a>
                                        {% endfor %}
                                    </div>
                                    <p class="mb-auto">{{post.description}}</p>
                                    <p class="mb-auto text-muted">{{post.published}}</p>
                                </div>
                            </div>
                        </div>       
                    </div>
                    {% endfor %}
            </div>
        </div>    
{% endblock content %}        

【问题讨论】:

    标签: django-taggit


    【解决方案1】:

    您可以使用 choices 参数添加 Select 小部件。

    参考:https://docs.djangoproject.com/en/3.1/ref/forms/widgets/

    from django import forms
    from .models import Post
    
    categories=(
        ('A', 'A'),
        ('B', 'B'),
        ('C', 'C'),
    )
                         
    class PostForm(forms.ModelForm):
        type = forms.ChoiceField(choices=categories)
        class Meta:
            model = Post
            fields = [
                'type',
                'title',
                'description',
                'tags',
            ]
            widgets = {
                'tags': forms.Select(choices=categories)
            }
    
    

    现在说帮助文本没有任何意义。因此,您可以在 TaggableManager()

    中传递您自己的帮助文本
    from django.db import models
    from taggit.managers import TaggableManager
    
    class Post(models.Model):
        ...
        tags = TaggableManager(help_text='Help text here')
    
        def __str__(self):
            return self.title
    

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多