【问题标题】:How do I tag users to a post如何将用户标记到帖子
【发布时间】:2020-06-09 20:33:58
【问题描述】:

我正在创建一个网站,用户可以在其中上传帖子并标记其他用户,就像 facebook 一样。我已经成功实现了一个 postform,并且还在模型中的 manytomany 字段中添加了一个标签字段。我对这个特定主题没有任何想法。那么我如何将用户标记到帖子中,当提交表单时,当帖子保存在管理员中时,标记的用户将被自动选择,这样当我在管理员中检查帖子时,我将能够看到标记的用户被选中在多对多领域。我有一个表单字段,在自动完成提交表单之前,将输入您要标记的用户名。

模型.py:

class Post(models.Model):
    poster_profile = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,blank=True,null=True)
    image_caption = models.TextField(blank=True, null=True)
    tag_someone = models.ManyToManyField(User, related_name='tagged_users', blank=True)

Forms.py

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = (
            'image_caption', 
            'tag_someone',
        )

Views.py:

@login_required
def upload_view(request):
    ImageFormset = modelformset_factory(File, fields=('files',), extra=20)
    if request.method == "POST":
        form = PostForm(request.POST)
        formset = ImageFormset(request.POST, request.FILES)
        if form.is_valid() and formset.is_valid():
            post = form.save(commit=False)
            post.poster_profile = request.user
            post.save()   
            form.save_m2m()

            for f in formset:
                try:
                    photo = File(post=post, files=f.cleaned_data['files'])
                    photo.save()
                except Exception as e:
                    break
            return redirect('/')              
    else:
        form = PostForm()
        formset = ImageFormset(queryset=File.objects.none())
    context = {
        'form': form,
        'formset': formset,
    }
    return render(request, 'upload.html', context)

上传.html

 <form method="POST" enctype="multipart/form-data">
 {% csrf_token %}
 <input type="file">
 <div class="ui-widget"> 
    <input type="text" name="tag_someone" class="form-control autocomplete" maxlength="50"id="id_tag_someone" placeholder="Enter username">
 </div>
 <button type="submit" class="btn btn-primary btn-sm">Post</button>
 </form>

【问题讨论】:

    标签: python django


    【解决方案1】:

    问题是您在保存调用中使用了 commit=false。根据 to the documentation 在 save() 调用中的 commit=false 将不会应用 ManyToMany 关系。它们需要“手动”应用:

    [...]
    post = form.save(commit=False)
    post.poster_profile = request.user
    post.save()
    form.save_m2m() # this line will save the ManyToMany relationships of the form
    [...]
    

    【讨论】:

    • @Tartempion...我添加了 form.save_m2m(),我的帖子没有提交。
    • @MrHize 你能在第一条消息上更新你的代码以查看差异吗?
    • 我刚刚在视图中添加了 form.save_m2m() 和 post.save() 的底部。当我点击帖子按钮时,帖子没有保存,它重定向到同一页面。
    • 你还能在第一条消息上编辑你的代码,让那些来这里看看已经完成的人。如果您的表单根本没有保存,但之前保存过,则表示这部分代码存在问题。 Django 会引发异常吗?
    • 我已将您的代码添加到 views.py 中的问题 form.save_m2m() 中。我没有收到任何错误,只是当我点击发布页面时重新加载并没有保存表单。
    【解决方案2】:

    我能够通过替换这个(输入字段)来完成这个工作:

    <input type="text" name="tag_someone" class="form-control autocomplete" maxlength="50"id="id_tag_someone" placeholder="Enter username">
    

    到这个(选择字段):

    <label for="id_tag_someone">Tag someone:</label><br>
    <select name="tag_someone" id="id_tag_someone" multiple="" class="chosen w-100">
    {% for user in tag_list_users %}
    <option value="{{user.pk}}">{{user}}</option>
    {% endfor %}
    </select> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多