django - 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()
解决方案
首先,如果您希望您的用户名仅由 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>
让我知道是否有错误
推荐阅读
- python - Tensorflow:重新运行训练会话时,get_variable 运行初始化程序并重新创建变量,而不是检索现有变量
- visual-studio-2017 - 带有 apache cordova 的 Visual Studio 2017 应用程序在使用 Debug-Windowsx64-Local Machine 的 AJAX Post 上获得 NetworkError 但适用于 Android 和 IOS
- java - GridBagLayout 网格高度约束不影响结果
- postgresql - 添加限制时是否有默认顺序?
- android - 互联网掉线后,Retrofit2 Singleton 导致 http 请求失败
- jenkins - 如何从 Jenkinsfile 触发组织扫描?
- javascript - 如何使用 Jest 测试 url 更改
- python - 在 Jenkins 代理上运行测试时如何使用 Selenium 捕获屏幕截图
- r - #R - FOR 循环 - 如何遍历 data.frame 列中向量的每个元素
- javascript - 样式顺序的重要性