【问题标题】:How to use django-taggit from view file如何从视图文件中使用 django-taggit
【发布时间】:2016-11-17 13:08:00
【问题描述】:

我希望用户能够标记他的帖子。所以,他会在文本字段中输入单词,并用“,”分隔它们。完成后,他按保存,他输入的所有标签都将保存到该帖子中。我正在使用 django-taggit,但是当用户在字段中输入他的话时,他们不会与帖子一起保存。但是当我从 django-admin 站点执行此操作时,它运行良好。

这是我的代码:

models.py:

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(settings.AUTH_USER_MODEL,
                               related_name='blog_posts')
    body = RichTextUploadingField()
    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() # The default manager
    published = PublishedManager() # Our custom manager
    tags = TaggableManager()
    category = models.ForeignKey(BlogCategory, related_name='post_category')

    header_photo = models.ImageField(upload_to = 'users/%Y/%m/%d',   
                                        null = True,
                                        blank = True,
                                        width_field="width_field",
                                        height_field="height_field"
                                        )
    width_field = models.IntegerField(default = 0, null = True)
    height_field = models.IntegerField(default=0, null = True)

forms.py:

class CreatePostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ('title', 'status', 'header_photo', 'body', 'tags')

views.py:

@login_required(login_url='account_login')
def create_post(request):
    if request.method == 'POST':
        post_form = CreatePostForm(data=request.POST, files=request.FILES)
        if post_form.is_valid():
            new_post = post_form.save(commit=False)
            new_post.author = request.user
            profile = Profile.objects.get(profile_user=request.user)
            new_post.category = profile.type_of_blogger
            new_post.slug = slugify(new_post.title)
            new_post.save()
            messages.success(request, 'Post created successfully', extra_tags='post_saved')
            # redirect to new created item detail view
            return redirect(new_post.get_absolute_url())
    else:
        post_form = CreatePostForm()
    context = {'post_form': post_form}
    return render(request,
                  'blog/post/create_post.html',
                  context)

urls.py:

urlpatterns = [
    # post views
    url(r'^$', views.post_list, name='post_list'),
    url(r'^create/$', views.create_post, name='create_post'),
    url(r'^detail/(?P<id>\d+)/(?P<slug>[-\w]+)/$', views.post_detail, name='post_detail'),
]

我的 html 表单:

<form class="form-horizontal text-center" method="post" action="." enctype="multipart/form-data">
                    {% csrf_token %}
                    {{ post_form.media }}
                    <fieldset>
                        <div class="container text-center" style="margin-bottom: 20px">
                            <h2 style="color: #c1b4b4;">Upload the header picture for your post</h2>
                            {% render_field post_form.header_photo style="background-color: #E8E8E8" %}
                        </div>
                        <div class="form-inline text-center">
                            <div class="form-group" style="margin-bottom: 20px;">
                                {% render_field post_form.title class="form-control" placeholder="Blog title" %}
                                {% render_field post_form.status class="form-control" %}
                                <p>Tag your post, so users can easy find it.</p>
                                {% render_field post_form.tags class="form-control" %}
                            </div>
                        </div>
                        {% render_field post_form.body class="form-control" %}
                        <hr>
                        <div class="control-group">
                            <!-- Button -->
                            <div class="controls" style="margin-bottom: 20px">
                                <button class="btn btn-lg btn-success" style="min-width: 300px">Save</button>
                            </div>
                        </div>
                        {% if redirect_field_value %}
                        <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
                        {% endif %}
                     </fieldset>
                </form>

感谢您的帮助。

【问题讨论】:

    标签: python django django-taggit


    【解决方案1】:

    尝试使用 save_m2m() 方法。

    来自docs

    如果在保存表单时使用了 commit=False 选项,则需要 保存对象后在表单上调用 save_m2m() ,就像您一样 将用于其上具有正常多对多字段的表单:

    if request.method == "POST":
    form = MyFormClass(request.POST)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.user = request.user
        obj.save()
        # Without this next line the tags won't be saved.
        form.save_m2m()
    

    【讨论】:

    • hmmmm 谢谢你的回复,我现在不能尝试,但我会尽快接受你的回答。
    猜你喜欢
    • 2015-12-12
    • 1970-01-01
    • 2019-03-12
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多