首页 > 解决方案 > 如果用户没有输入可选值,如何通过表单(不是 django 表单)接收 django 视图中的可选值?

问题描述

由于我的图像选项是可选的,即使文件没有上传,我也想保存它,因为它是可选的,但它给了我错误,因为它无法接收图像。即使该字段为空,如何将其保存在数据库中?即使我们有多个可选值,如何在数据库中接收和保存这些空类型条目?

#Model
    class Recommendations(models.Model):
        Name = models.CharField(max_length=100)
        Company = models.CharField(max_length=100, null=True)
        Designation = models.CharField(max_length=100, default='Null')
        Message = models.TextField(null=False)
        image = models.ImageField(upload_to='Recommender', default='default.png', blank=True)
        check = models.BooleanField(default=False)


    # Views Code to receive the data through a form

    def recommend(request):
        if request.method == 'POST':
            try:
                name = request.POST['name']
                company = request.POST['company']
                designation = request.POST['designation']
                message = request.POST['message']
                image = request.FILES['photo']
                recom = Recommendations(Name=name,Company=company,Designation=designation, Message=message, image=image)
                recom.save()
                messages.success(request,'Recommendation Recieved')
                return redirect('/')
            except Exception as problem:
                print(problem)
                messages.error(request, problem)
                return redirect('/')

标签: pythondjangodjango-modelsdjango-file-upload

解决方案


您应该使用字典的方法获取数据,而不是通过request.POST['field'](或)访问数据。这样,如果您收到空字段,您可以定义值(默认情况下)分配给您的变量,从而防止.request.FILE['name']get()NoneKeyError

我会实现这样的事情:

def recommend(request):
        if request.method == 'POST':
            try:
                data = {
                    'name': request.POST.get('name'),
                    'company': request.POST.get('company'),
                    'designation': request.POST.get('designation'),
                    'message': request.POST.get('message'),
                    'image' = request.FILES.get('photo')
                }
                data = {k: v for k, v in data.items() if v}
                recom = Recommendations(**data)
                recom.save()
                messages.success(request,'Recommendation Recieved')
                return redirect('/')
            except Exception as problem:
                print(problem)
                messages.error(request, problem)
                return redirect('/')

推荐阅读