在 Django 中,当登录用户提交表单时,如何自动将用户名添加到模型
In Django, how to add username to a Model automatically, when the Form is submitted by a logged in user
在我的 Django 应用程序中,我使用 ForeignKey 定义了多对一关系。 现在我想要的是,当登录用户提交 ListForm
时,他的 username
应该自动添加到 ListModel
的 owner
字段中。 目前,当用户提交表单时,None
显示在所有者字段中,如何将用户名与表单一起添加到数据库?
我的models.py:
from django.db import models
from django.contrib.auth.models import User
class ListModel(models.Model):
owner = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE)
task = models.CharField(max_length=255)
completed = models.BooleanField(default=False)
我的forms.py:
from django.forms import ModelForm
from .models import ListModel
from django import forms
class ListForm(ModelForm):
class Meta:
model = ListModel
fields = ['owner','task', 'completed']
您必须覆盖视图的 form_valid()
方法并将当前登录的用户附加为所有者。
def form_valid(self, form):
form.instance.owner = self.request.user <------ This line will do the trick.
return super().form_valid(form)
终于成功了 (my solution reference)
首先,我们需要从forms.py中的ModelForm中排除owner
字段:
class ListForm(ModelForm):
class Meta:
model = ListModel
fields = ['task', 'completed']
# instead of above line we can simply write: exclude = ['owner']
并且在 views.py:
form = ListForm(request.POST)
if form.is_valid():
task_list = form.save(commit=False)
task_list.owner = request.user
task_list.save()
return redirect('/')
我们可以使用任何变量而不是 task_list
并且还要注意在 task_list.save()
之后不需要做 form.save()
因为它已经包含在 task_list = form.save(commit=False)
在我的 Django 应用程序中,我使用 ForeignKey 定义了多对一关系。 现在我想要的是,当登录用户提交 ListForm
时,他的 username
应该自动添加到 ListModel
的 owner
字段中。 目前,当用户提交表单时,None
显示在所有者字段中,如何将用户名与表单一起添加到数据库?
我的models.py:
from django.db import models
from django.contrib.auth.models import User
class ListModel(models.Model):
owner = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE)
task = models.CharField(max_length=255)
completed = models.BooleanField(default=False)
我的forms.py:
from django.forms import ModelForm
from .models import ListModel
from django import forms
class ListForm(ModelForm):
class Meta:
model = ListModel
fields = ['owner','task', 'completed']
您必须覆盖视图的 form_valid()
方法并将当前登录的用户附加为所有者。
def form_valid(self, form):
form.instance.owner = self.request.user <------ This line will do the trick.
return super().form_valid(form)
终于成功了 (my solution reference)
首先,我们需要从forms.py中的ModelForm中排除owner
字段:
class ListForm(ModelForm):
class Meta:
model = ListModel
fields = ['task', 'completed']
# instead of above line we can simply write: exclude = ['owner']
并且在 views.py:
form = ListForm(request.POST)
if form.is_valid():
task_list = form.save(commit=False)
task_list.owner = request.user
task_list.save()
return redirect('/')
我们可以使用任何变量而不是 task_list
并且还要注意在 task_list.save()
之后不需要做 form.save()
因为它已经包含在 task_list = form.save(commit=False)