基于类的CreateView Django中的两种形式

时间:2018-10-08 09:11:15

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

我想通过创建视图插入数据。我在一个视图中有两种形式,我无法处理它们。我一次保存一种形式,而不是同时保存它们。在一种形式中,我有csv现在,我已经通过html文件的通用方法保存了第一个表单,只是获取了CSV文件并保存了它。 但是对于第二种形式,我已经使用Uploadform并想使用createview方法保存它。到目前为止,我无法做到这一点,对django来说还很陌生,并且感到困惑。到目前为止,我了解了form.save在类中不起作用基于视图。请有人提出一个正确的解决方案,如何保存uploadform。 代码如下:

  class Addfile(CreateView):

template_name = 'essay/THome.html'
model=UploadAssignment
form_class = UploadForm

def get(self,request):
    form=self.form_class(None)
    #myform=self.upload_form(None)
    return render(request, self.template_name, {'form': form})


def post(self,request):
  upload=UploadForm(request.POST or None)
  form = self.form_class(None)

  if not(upload.is_valid()):
    csv_file=request.FILES["csv_file"]

    if not csv_file.name.endswith('.csv'):
        messages.error(request, 'File is not csv type')
        return redirect('essay:file')

    if csv_file.multiple_chunks():
        messages.error(request, "File size is too big (%.2f MB)." %(csv_file.size/(1000*1000),))
        return redirect('essay:file')

    file_data=pandas.read_csv(csv_file)
    myids=file_data['id'].tolist()
    passwords=file_data['password'].tolist()
    t_len=len(myids)
    teacher=get_object_or_404(Teacher.objects.filter(user=request.user))

    for iterate in range(0,t_len):
        if (User.objects.filter(username=myids[iterate]).exists() == 1):
            messages.error(request, "Cannot register students username already exists")
            return render(request, self.template_name, {'form': form})

        obj=User.objects.create_user(username=myids[iterate],password=passwords[iterate],is_student=True,is_prof=False)
        obj.save()
        Student.objects.create(user=obj,teacher=teacher,batch="F-14")
  else:
          form.teacher = self.request.user
          form.save()


  return render(request,self.template_name,{'form':form})

如果上载表单无效,则保存CSV文件数据,否则保存上载表单数据。保存CSV文件但上载表单在else语句中不起作用。在上载表单中,除教师以外的所有字段均来自html表单,这是外键来自登录用户。

Forms.py:
class UploadForm(forms.Form):
model=UploadAssignment
Title=forms.CharField(widget=forms.TextInput(
    attrs={
        "size":40
    }
))
deadline=forms.DateField(widget=forms.SelectDateWidget)
Description=forms.CharField(required=True,label="Text",widget=forms.Textarea(
    attrs={
        "rows":20,
        "cols":100
    })
)
fields=['title','deadline','description']

在models.py中上传分配:

class UploadAssignment(models.Model):
teacher=models.ForeignKey(Teacher,on_delete=models.CASCADE)
title=models.CharField(max_length=30)
deadline=models.DateField()
description=models.CharField(max_length=100)

我感觉自己写的代码不好,但是如果可以解决的话,我仍然会非常感激。

0 个答案:

没有答案