我是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>
理想的结果是用户提交表单时,将所有内容保存到我的数据库中并清理表单以供用户重用。
答案 0 :(得分:1)
您使用以下方法构造一个ClientModel
:
ClientModel(name=name, reason=reason, time_spent=time_spent,
dec_name=request.user)
但这没有任何意义,因为您的ModelForm
应该这样做,因为reason
,time_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
,但表单的开头还是 not formset [Django-doc]。
注意:django中的表单通常带有
Form
后缀,以避免与模型混淆。因此,您可能想在{s>PushTaskForm
上使用PushTask
。
答案 1 :(得分:0)
我怀疑问题出在我的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})
我很乐意接受其他解释。