哪个模型字段类型适用于重复保存在数据库中的日期时间对象,需要显示为字符串?

时间:2017-10-25 14:26:12

标签: django django-models django-forms django-templates django-views

这个问题有点含糊不清,请允许我解释一下:

我正在创建类似更改日志的内容,它会记录创建对象的日期时间以及创建的对象。当在数据库中更新对象时,我将获得日期时间的快照,并记录新更改的对象以及当前&新的日期时间 - 以前的对象快照+日期时间也已存储。以下是我尝试在网站上显示为文本的“更改日志”的示例:

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",
        ]

编辑:如果我需要进一步澄清问题,请告诉我

1 个答案:

答案 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