这个问题有点含糊不清,请允许我解释一下:
我正在创建类似更改日志的内容,它会记录创建对象的日期时间以及创建的对象。当在数据库中更新对象时,我将获得日期时间的快照,并记录新更改的对象以及当前&新的日期时间 - 以前的对象快照+日期时间也已存储。以下是我尝试在网站上显示为文本的“更改日志”的示例:
Oct. 24, 2017, 11:22 a.m
"Cats and dogs", "Apples and oranges"
Oct. 19, 2017, 12:04 p.m
"This is a string object", "This is the second object/preference"
Sep. 03, 2017, 01:22 a.m
"This object was saved long ago", "As was this one"
所以,问题是双重的 - 哪个模型字段类型适合于需要记录当前日期时间的对象,还有我如何使用以前的更改日志作为要显示的文本保留在数据库中,而不是仅查询最新的文本?
在以下尝试失败中,Profile
模型包含要更改和记录的对象/“首选项”,以及用于保存当前日期的updated
字段 - 保存对象的时间。计划是在保存对象之后发送信号,该对象将调用get_preference()
类方法,该类方法返回要记录的对象的元组。这将通过post_save信号保存到old_preferences
属性,该信号将在View中查询并作为更改日志的一部分发送到模板。
根据我的理解,当我更新表格时,它会导致save()
触发信号。
唉,它根本不起作用,我不知道为什么它没有。
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
null=True, blank=True)
preference1 = models.CharField(max_length=54, blank=True, null=True)
preference2 = models.CharField(max_length=54, blank=True, null=True)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
old_preferences = models.CharField(max_length=300)
@classmethod
def get_preference(cls):
preference_set = cls.preference1, cls.preference2
return preference_set
def profile_post_save_receiver(sender, instance, created, *args, **kwargs):
if instance:
Profile.objects.old_preferences = Profile.get_preference()
post_save.connect(profile_post_save_receiver, sender=Profile)
此外,以下是视图,表单和模板的相关部分
观点:
class PreferenceUpdateView(LoginRequiredMixin, UpdateView):
form_class = PreferenceUpdateForm
template_name = 'profile/preference_edit.html'
def get_object(self, *args, **kwargs):
# print(self.kwargs)
user_profile = self.kwargs.get('username')
# user_profile = self.kwargs.get('id')
obj = get_object_or_404(Profile, user__username=user_profile)
return obj
def form_valid(self, form):
print(self.kwargs)
instance = form.save(commit=False)
instance.user = self.request.user
return super(PreferenceUpdateView, self).form_valid(form)
模板:
{{object.updated}}
{{object.old_preferences}}
表格:
from .models import Profile
from django import forms
class PreferenceUpdateForm(forms.ModelForm):
class Meta:
model = Profile
fields = [
"preference1",
"preference2",
]
编辑:如果我需要进一步澄清问题,请告诉我
答案 0 :(得分:0)
也许我不能正确理解你想要实现的目标,但这看起来像是一个非常复杂的方法。为什么不将旧配置文件保留为配置文件中的数据集?您只需要更改与ManyToOne的关系,并在UpdateView中确保您只阅读最新的配置文件:
模型
class Profile(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
null=True, blank=True)
from django.http import Http404
视图
class PreferenceUpdateView(LoginRequiredMixin, UpdateView):
form_class = PreferenceUpdateForm
template_name = 'profile/preference_edit.html'
def get_object(self, *args, **kwargs):
user_profile = self.kwargs.get('username')
try:
obj = Profile.objects.filter(user__username=user_profile).latest('updated')
return obj
except Profile.DoesNotExist:
raise Http404