首页 > 解决方案 > Django模型在文章修改时自动更新用户名和日期/时间

问题描述

我有一个名为 Post 的模型,我正在尝试自动保存上次修改文章的登录用户的用户名以及时间戳。到目前为止 DateTime 时间戳正在更新值,但我无法使用用户名获得相同的结果。

模型.py

class Post(models.Model):
    article = models.TextField(max_length=2000)
    username = models.ForeignKey(User, on_delete=models.CASCADE, related_name='usernames')
    updated_at = models.DateTimeField(auto_now=True)

表格.py

class PostForm(ModelForm):

    def __init__(self, *args, **kwargs):    

        super(PostForm, self).__init__(*args, **kwargs)
        
    class Meta:
        model = Post
        fields = '__all__'

视图.py

class PostUpdate(UpdateView):
    model = Post
    form_class = PostForm
    
    def save_model(self, request, obj, form, change):
        obj.username = request.user
        obj.save()

标签: djangodjango-modelsdjango-viewsdjango-formsdjango-templates

解决方案


首先,如果您希望您的用户名仅由 request.user 设置,然后将 editable=False 添加到 Post 模型中的用户名字段。

username = models.ForeignKey(User, on_delete=models.CASCADE, related_name='usernames', editable=False)

然后在您的admin.py中:

from . import models
from django.contrib import admin

class PostAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.username = request.user
        obj.save()

admin.site.register(models.Post, PostAdmin)

编辑从这里开始

模型.py

from django.db import models
from django import forms

class Post(models.Model):
    article = models.TextField(max_length=2000)
    username = models.ForeignKey(User, on_delete=models.CASCADE, related_name='usernames') # we don't need editable=False anymore
    updated_at = models.DateTimeField(auto_now=True)


class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = '__all__'

视图.py

from . import models
from django.shortcuts import render, get_object_or_404
from django.contrib import messages

def post(request, id):
    post = get_object_or_404(models.Post, id=id) # get a specific post with id
    if request.method == 'POST':
        form = models.PostForm(request.POST, instance=post) # create a post form instance
        if form.is_valid():
            data = models.Post() # create a post model instance
            data.article = form.cleaned_data['article']
            data.username = request.user
            # updated_at field updating automatically
            data.save() # dont't forget to save these data
            messages.success(request, 'Article updated successfully') # this line is optional
        else:
            messages.success(request, form.errors) # this line is optional
    else:
       form = models.PostForm(instance=post)
    return render(request, 'post.html', {'form': form})

        

网址.py

from django.urls import path
from . import views

app_name = 'post'
urlpatterns = [
    path('post/<int:id>', views.post, name='article'),
]

没有小部件调整的html(模板)(简单形式)

<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Send</button>
</form> 

带有小部件调整和引导类(可选)的html(模板)

{% load widget_tweaks %}

<form method="POST">
    {% csrf_token %}
    {% for field in form %}
    <div class="form-group">
        <div class="form-control-border"></div>
        {{ field.label }}
        {% render_field field class="form-control" %}
    </div>
    {% endfor %}
    <button type="submit" class="btn btn-outline-primary-2">Send</button>
</form> 

让我知道是否有错误


推荐阅读