2016-11-17 3 views
0

Я хочу, чтобы пользователь мог отметить свой пост. Итак, он вводит слова в текстовое поле и разделяет их на «,». Когда он закончит, он нажимает save и все теги, которые он ввел, будут сохранены в этом сообщении. Я использую django-taggit, но когда пользователь вводит свои слова в поле, они не сохраняются в сообщении. Но когда я делаю это с сайта django-admin, он отлично работает.Как использовать django-taggit из файла вида

Вот мой код:

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> 

Спасибо за вашу помощь.

ответ

0

Попробуйте использовать метод save_m2m().

От docs:

Если при сохранении формы, вы используете совершить = 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() 
+0

хммм спасибо за вам ответ, я не могу попробовать это прямо сейчас, но как только я приму ваш ответ. – P3P5

Смежные вопросы