Django如何在不出现在表单帖子中的情况下为模型保存价值



我有以下模型/窗体/视图:

型号

class Account(models.Model):
username = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
name = models.CharField(max_length=150)
identifier_type = models.ForeignKey(IdentifierType, on_delete=models.SET_NULL, null=True)
actflag = models.CharField(max_length=1, blank=True)
created_date = models.DateTimeField(blank=True, null=True)
comments = models.TextField(_(
'comments'), max_length=500, blank=True)
priority_type = models.ForeignKey(PriorityType, on_delete=models.SET_NULL, null=True)
deadline_date = models.DateTimeField(blank=True, null=True)

def __str__(self):
return self.name

表单

class PortfolioForm(forms.ModelForm):
portfolio = forms.CharField(widget=forms.Textarea)
class Meta:
model = Account
fields = ['name', 'comments', 'priority_type', 'deadline_date', 'identifier_type', 'portfolio']

查看

def portfolios(request):
if request.user.is_authenticated:
if request.POST:
fm = PortfolioForm(request.POST)
user = User.objects.get(username=request.user)
if fm.is_valid():
messages.success(request, 'Portfolio has been created.')                
fm.save()
return redirect('portfolios')
else:
fm = PortfolioForm()
context = {"name": request.user, "form": fm}
return render(request, 'portfolios.html', context)
else:
return redirect('login')

表单可以通过我的模板进行张贴,但你会注意到,我的模型中有一些字段不在我的表单中,我想在用户不必填写的情况下自动填写-例如,username字段我希望这是提交表单的当前用户,created_date也希望用户提交表单的日期时间。

我试图在if-fm.is_valid((下将以下内容添加到我的视图中:试图将用户名作为当前用户保存到模型中,但没有成功:

Account.objects.username = request.user

我该怎么做?提前感谢

保存表单时,可以在创建Account对象后保存这些值。如果在save方法中使用commit=False参数,则不会影响数据库,并且可以轻松修改Account对象。

from django.utils import timezone

def portfolios(request):
if request.user.is_authenticated:
if request.POST:
fm = PortfolioForm(request.POST)
# user = User.objects.get(username=request.user)
if fm.is_valid():               
account = fm.save(commit=False)
account.username = request.user 
account.created_date = timezone.now()
account.save()
messages.success(request, 'Portfolio has been created.') 
return redirect('portfolios')
else:
fm = PortfolioForm()
context = {"name": request.user, "form": fm}
return render(request, 'portfolios.html', context)
else:
return redirect('login')

您可以使用django表单instance来保存任何预定义的值,而无需向用户或html模板显示或呈现这些字段。下面是一个如何自动保存用户名和created_date字段的示例。

if fm.is_valid():               
fm = fm.save(commit=False)
fm.instance.username = request.user  
fm.instance.created_date = timezone.now()
fm.save()

相关内容

最新更新