Django taggit如何记录添加了标签的用户的ID

时间:2019-07-19 22:49:53

标签: django django-taggit

我有使用django-taggit模块的Django应用。

我正在尝试修改django-taggit模型,以便我可以记录添加标签的人员的用户ID。

我通过修改request.user来为user_id表中的taggit_tags添加了class TagBase(models.Model):的新列,如下所示。这样可以成功地将新的user_id列添加到taggit_tags`表中。

我的过程是添加照片,然后回到照片以使用photo_edit视图,photo_edit表单和photo_edit.html模板分配标签,如下所示。

这些成功允许标记成功工作,并将标记以'tags': TagWidget()的形式显示。这样可以正常工作,并且可以针对该照片保存新的,修改的或删除的标签。

但是,我无法弄清楚如何在request.user taggit_tags字段中保存user值。

由于这是默认功能,因此理想情况下将其保存在django taggit标签模型中。但是将request.user引入模型并不容易或简单(不是吗?)

request.user视图中保存photo_edit的表单验证将是下一个执行此操作的地方,但不清楚是否有可用的语法来保存相关的模型字段。 save_m2m功能需要来自user'tags': TagWidget()字段的输入。如果可能的话,似乎伴随着django taggit的修改会相当广泛吗?

照片编辑表

class PhotoEditForm(ModelForm):
    #filename = forms.ImageField()
    class Meta:
        model = Photo
        fields = (
            'tags',
        )
        widgets = {
            'tags': TagWidget(),
        }

照片编辑视图-理想情况下,我可以在request.user之前保存form.save_m2m(),例如photo.taggit_tag.user_id = user.id。有一些语法可以在这里工作吗?

def photo_edit(request, photo_id):
    photo = Photo.objects.get(id=int(photo_id))
    user = get_user_model().objects.get(id=request.user.id)
    photo_tags = Tag.objects.filter(photo=photo.id).order_by('name')

    if request.method == "POST":
        form = PhotoEditForm(request.POST, instance=photo)

        if form.is_valid():
            photo = form.save(commit=False)
            photo.modified = timezone.now()
            photo = form.save()

            #save tags if any
            form.save_m2m()

            return HttpResponseRedirect(reverse('photo', kwargs={ 'photo_id': photo.id,}))

    else:
        form = PhotoEditForm(instance=photo)

    context = { 
        'photo_form': form,
        'photo': photo, 
        'photo_tags': photo_tags,
        'title': 'Edit Mode',
        }

    return render(
        request,
        'photo_edit.html',
        context,

    )  

照片模型

class Photo(models.Model):
    filename = CloudinaryField('image')
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=True)
    inactive = models.BooleanField(default=False, choices=INACTIVE_CHOICES)
    created = models.DateTimeField(blank=True, null=True)
    modified  = models.DateTimeField(blank=True, null=True)
    tags = TaggableManager()

    class Meta:
        managed = True
        db_table = 'photo'
        verbose_name_plural = 'photos'

    def __str__(self):
        return str(self.filename)

我确实对django taggit模型进行了少许修改,以包含user_id字段。理想情况下,我可以将此user_id设置为request.user作为默认值,但还没有看到任何看起来简单的东西。

class TagBase(models.Model):
    name = models.CharField(verbose_name=_("Name"), unique=True, max_length=100)
    slug = models.SlugField(verbose_name=_("Slug"), unique=True, max_length=100)
    # added user to model which created `user_id` column on `taggit_tags` table
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=True)

    def __str__(self):
        return self.name

    def __gt__(self, other):
        return self.name.lower() > other.name.lower()

    def __lt__(self, other):
        return self.name.lower() < other.name.lower()

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        if self._state.adding and not self.slug:
            self.slug = self.slugify(self.name)
            using = kwargs.get("using") or router.db_for_write(
                type(self), instance=self
            )

1 个答案:

答案 0 :(得分:1)

您可能想看看django-crum:Django-CRUM(当前请求用户中间件)在线程本地存储中捕获当前请求和用户。

在解决类似问题时,我使用了它。它允许您访问当前用户,而不必直接传递请求对象:

https://django-crum.readthedocs.io/en/stable/