当我在Django中将“ LoginRequiredMixin”传递给我的“ view”时,为什么不能将表单提交至数据库?

时间:2019-08-28 10:55:23

标签: django django-forms

我是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>

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

2 个答案:

答案 0 :(得分:1)

您使用以下方法构造一个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,但表单的开头还是 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})

我很乐意接受其他解释。