为什么当我在 Django 中将"LoginRequiredMixin"传递给我的"视图"时,我无法将表单提交到数据库?



我是Django新手,我正在尝试为我的同事制作一个非常简单的应用程序,以便在客户端上提交他们的任务以及他们完成任务需要多长时间。

我可以通过管理页面很好地提交到我的模型,但我不能通过 HTML 页面将其作为表单提交。

我正在使用django-autocomplete-light它也工作正常。

# This is my forms.py file
class PushTask(ModelForm):
name = CharField()
class Meta(object):
"""docstring for Meta."""
model = ClientModel
fields = ['name', 'reason', 'time_spent']
widgets = {
'name': autocomplete.ModelSelect2(url='name-autocomplete'),
}
# This is a part of my models.py file
class ClientModel(models.Model):
Aa = models.AutoField(primary_key=True, unique=True)
name = models.ForeignKey(Clientele, on_delete=models.CASCADE)
time_spent = models.TimeField(default=None)
dec_name = models.CharField(max_length=100, default=None)
reason = models.ForeignKey(Task, on_delete=models.CASCADE)
date_added = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name.name
# ths is my views.py which I believe is causing the issue
class RecordView(LoginRequiredMixin, View):
template_name = 'manage_records.html'
def get(self, request):
print('I got the form ')
formset = PushTask()
return render(request, self.template_name, {'formset': formset})
def post(self, request):
print('I posted ')
formset = PushTask(request.POST)
if formset.is_valid():
ClientModel(name=name, reason=reason, time_spent=time_spent, 
dec_name=request.user)
formset.save()
formset = PushTask()
return HttpResponseRedirect('manage_records.html')
args = {'formset': formset}
return render(request, self.template_name, {'formset': formset})
<!-- this is my html form -->
<form method="POST" id="former">
{% csrf_token %}
{{ formset.as_table }}
</form>

期望的结果是当用户提交表单时,将所有内容保存到我的数据库中并清理表单以供用户重复使用。

你用以下方法构造一个ClientModel

ClientModel(name=name, reason=reason, time_spent=time_spent, 
dec_name=request.user)

但这没有任何意义,因为你的ModelForm应该这样做,而且因为reasontime_spent等都没有定义。

此外,您似乎重定向到模板名称,而不是视图的名称(或视图的路径(。

以上看起来很像CreateView[Django-doc],因此我强烈建议使用这样的视图,并改变你想要改变的行为:

from django.urls import reverse_lazy
from django.views.generic.edit import CreateView
class RecordView(LoginRequiredMixin, View):
template_name = 'manage_records.html'
form_class = PushTask
success_url = reverse_lazy('some-view-name')

在这里,表单将在您的模板中具有名称form,而不是formset,但无论如何,您的表单首先不是表单集[Django-doc]。

注意:通常 django 中的表单有一个Form后缀,以避免与模型混淆。因此,您可能希望使用PushTaskForm而不是PushTask

正如我所怀疑的那样,问题出在我的views.py上。我相信这段代码return render(request, self.template_name, {'formset': formset})在表单有机会检查验证之前运行。

正确的代码:

# views.py
class RecordView(LoginRequiredMixin, View):
template_name = 'manage_records.html'
username = ''
def get(self, request):
print('I got the form ')
form = PushTask()
return render(request, self.template_name, {'form': form})

def post(self, request):
if request.user.is_authenticated:
print('prepost')
form = PushTask(request.POST)
print('I'm in post function')
if form.is_valid():
profile = form.save(commit=False)
# profile.ip_address = request.META['REMOTE_ADDR']
profile.dec_name = request.user
profile.save()
return redirect('recorder')
print('Prob Not')
args = {'form': form}
return render(request, self.template_name, {'form': form})

我很乐意接受任何其他解释。

最新更新