我有使用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
)
答案 0 :(得分:1)
您可能想看看django-crum:Django-CRUM(当前请求用户中间件)在线程本地存储中捕获当前请求和用户。
在解决类似问题时,我使用了它。它允许您访问当前用户,而不必直接传递请求对象: