我正在尝试保存具有以下字段的模型表单
class DiaryText(models.Model):
DiaryUser=models.CharField(max_length=30,unique=False)
DateCreated=models.DateTimeField(default=timezone.now)
DiaryBody=models.TextField(max_length=10000)
DiaryHeading=models.CharField(max_length=50,unique=False,null=True)
相应的模型形式是:-
class MakeADiaryForm(forms.ModelForm):
class Meta:
model=DiaryText
fields={'DiaryHeading','DiaryBody'}
widgets={
'DiaryHeading':forms.TextInput(attrs={'placeholder':'Enter Title','class':'Headline'}),
'DiaryBody':forms.Textarea(attrs={'placeholder':'Start Writing','class':'BodyDiary'}),
}
对应的视图功能如下:-
def NewEntryView(request,slug):
UserPresent=get_object_or_404(DiaryUser,Username=slug)
if request.method=='POST':
form=MakeADiaryForm(request.POST)
if form.is_valid():
BlogEntry=form.save(commit=False)
BlogEntry.DiaryUser=slug
BlogEntry.save()
return redirect('Display',**{'slug':BlogEntry.DiaryUer})
else:
form=MakeADiaryForm()
return render(request,'Mobile/AddNewEntry.html',{'form':form,'slug':slug})
但是表单没有保存输入的值,并且继续重定向到同一页面。这里显示的是另一个视图的名称,而slug是用户名。 我还可以使用更好的关键字代替像用户名一样的吗?如果是,请指定操作方法
答案 0 :(得分:0)
当您刚接触Django表单时,这很常见。开发人员可能经常执行的一些操作可能会导致此问题:
(1)未提及CSRF令牌: Django使用CSRF令牌作为一种加密方式,可将您提供的所有信息发送到服务器。如果您没有在HTML模板中定义它,则取决于您对提交的管理方式,您的页面可能会抛出错误或只是重新加载。
(2)未声明表单方法:这似乎是您所要解决的问题。当开发人员刚接触HTML时,他们常常忘记声明将使用其表单进行的HTTP方法调用。确保声明您正在form标记内进行POST方法调用,并且该方法应该起作用。这是一个示例:
<form method = "POST" action = "">
让我知道这是否可以解决问题。
答案 1 :(得分:0)
首先,return
放置在错误的位置(也许只是SO代码模式完成了此操作),您必须在表单中定义实例,否则它将创建新的一个。当然,这是您的问题。
def NewEntryView(request,slug):
UserPresent=get_object_or_404(DiaryUser,Username=slug)
if request.method=='POST':
form=MakeADiaryForm(request.POST, instance=UserPresent) # You have to define the instance you want to edit othervise it tries to create a new one. Most probobly this was your issue
if form.is_valid():
BlogEntry=form.save(commit=False)
BlogEntry.DiaryUser=slug
BlogEntry.save()
return redirect('Display',**{'slug':BlogEntry.DiaryUer})
else:
form=MakeADiaryForm()
return render(request,'Mobile/AddNewEntry.html',{'form':form,'slug':slug}) # here
请确保您的方法名称在表单中为POST
,并且您没有使用任何操作,因为您正在使用urls.py
重定向表单。另一个原因可能是表单未通过is_valid()过滤器。确保您要插入有效数据。
提示:在模板中使用{{ form.as_p }}
(如果成功加载),这意味着您的问题出在is_valid()
过滤器上。或者,您可以在print('valid')
之后检查is_valid():
。