Django表单未提交

时间:2018-12-17 04:31:38

标签: python django django-models django-forms django-views

我正在尝试保存具有以下字段的模型表单

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是用户名。 我还可以使用更好的关键字代替像用户名一样的吗?如果是,请指定操作方法

2 个答案:

答案 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():