Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django ImageField未通过django rest framework将文件保存在正确的目录中_Django_Django Rest Framework - Fatal编程技术网

django ImageField未通过django rest framework将文件保存在正确的目录中

django ImageField未通过django rest framework将文件保存在正确的目录中,django,django-rest-framework,Django,Django Rest Framework,发送post请求时,图像保存在media/user\u None/pic/1602746423.311224\u profile.png中,而不是media/user\u{id}/pic/1602746423.311224\u profile.png HTTP 201 Created Allow: POST, OPTIONS Content-Type: application/json Vary: Accept { "username": "ramver

发送post请求时,图像保存在media/user\u None/pic/1602746423.311224\u profile.png中,而不是media/user\u{id}/pic/1602746423.311224\u profile.png


HTTP 201 Created
Allow: POST, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "username": "ramverma",
    "email": "ram@gmail.com",
    "mobile_num": null,
    "first_name": "Ram",
    "middle_name": "",
    "last_name": "Verma",
    "dob": null,
    "doj": null,
    "sex": "m",
    "department": 6,
    "profile_pic": http://localhost:8000/media/user_None/pic/1602764174.8516657_ProfiePic.png
}

**1st Issue**
教师模式

class Teacher(AbstractUser):
    profile_pic = models.ImageField(verbose_name="Profile Picture",blank=True,null=True,upload_to=file_pic,default='default.png')
    middle_name = models.CharField(max_length=30, blank=True, null=True)
    dob = models.DateField(verbose_name='Date Of Birth', null=True)
    doj = models.DateField(verbose_name='Date Of Join', null=True)
    mobile_num = models.CharField(verbose_name='Mobile Number',max_length=10,null=True,blank=True)

    SEX_CHOICE = (
        ('m','Male'),
        ('f','Female'),
        ('t','Transgender'),
        ('o','Others')
    )
    sex = models.CharField(max_length=1,choices=SEX_CHOICE,default='m')
    department = models.ForeignKey('Department',on_delete=models.SET_NULL,null=True)
用于ImageField的文件\u pic功能,用于根据其id将照片保存在用户文件夹中

def file_pic(instance, filename):
    return 'user_{0}/pic/{2}_{1}'.format(instance.id, filename, time.time())
用于教师创建的序列化程序

class TeacherCreateSerializer(ModelSerializer):
    password2 = CharField(write_only=True, style={'input_type':'password'})
    class Meta:
        model = Teacher
        fields = [
            'username',
            'email',
            'mobile_num',
            'first_name',
            'middle_name',
            'last_name',
            'dob',
            'doj',
            'sex',
            'department',
            'profile_pic',
            'password',
            'password2'
        ]
        extra_kwargs = {
            'password' : {'write_only':True, 'style':{'input_type':'password'}}
        }

    def create(self,validated_data):
        vd_cpy = validated_data
        password1 = vd_cpy['password']
        password2 = vd_cpy['password2']
        vd_cpy.pop('password2')
        vd_cpy.pop('password')
        teacher = Teacher(**vd_cpy)

        if(password1!=password2):
            raise ValidationError('password doesn\'t match')
        teacher.set_password(password1)
        teacher.save()
        return validated_data
    
    def validate_mobile_num(self,value):
        value = self.initial_data.get('mobile_num',None)
        if value is None or len(value) == 0:
            return None
        if(re.search(r'^((\+?91|0)?){1}[1-9]{1}[0-9]{9}$',value) is None):
            raise ValidationError('Invalid Mobile Number')
        return value
    
    def validate_email(self,value):
        if(Teacher.objects.filter(email=value).exists()):
            raise ValidationError('email already registered')
        return value
class TeacherCreateAPIView(CreateAPIView):
    queryset = Teacher.objects.all()
    serializer_class = TeacherCreateSerializer
    permission_classes = [AllowAny]
    parser_classes = (JSONParser,FormParser,MultiPartParser)
教师创建的APView

class TeacherCreateSerializer(ModelSerializer):
    password2 = CharField(write_only=True, style={'input_type':'password'})
    class Meta:
        model = Teacher
        fields = [
            'username',
            'email',
            'mobile_num',
            'first_name',
            'middle_name',
            'last_name',
            'dob',
            'doj',
            'sex',
            'department',
            'profile_pic',
            'password',
            'password2'
        ]
        extra_kwargs = {
            'password' : {'write_only':True, 'style':{'input_type':'password'}}
        }

    def create(self,validated_data):
        vd_cpy = validated_data
        password1 = vd_cpy['password']
        password2 = vd_cpy['password2']
        vd_cpy.pop('password2')
        vd_cpy.pop('password')
        teacher = Teacher(**vd_cpy)

        if(password1!=password2):
            raise ValidationError('password doesn\'t match')
        teacher.set_password(password1)
        teacher.save()
        return validated_data
    
    def validate_mobile_num(self,value):
        value = self.initial_data.get('mobile_num',None)
        if value is None or len(value) == 0:
            return None
        if(re.search(r'^((\+?91|0)?){1}[1-9]{1}[0-9]{9}$',value) is None):
            raise ValidationError('Invalid Mobile Number')
        return value
    
    def validate_email(self,value):
        if(Teacher.objects.filter(email=value).exists()):
            raise ValidationError('email already registered')
        return value
class TeacherCreateAPIView(CreateAPIView):
    queryset = Teacher.objects.all()
    serializer_class = TeacherCreateSerializer
    permission_classes = [AllowAny]
    parser_classes = (JSONParser,FormParser,MultiPartParser)
注册后,DRF API资源管理器会显示什么


HTTP 201 Created
Allow: POST, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "username": "ramverma",
    "email": "ram@gmail.com",
    "mobile_num": null,
    "first_name": "Ram",
    "middle_name": "",
    "last_name": "Verma",
    "dob": null,
    "doj": null,
    "sex": "m",
    "department": 6,
    "profile_pic": http://localhost:8000/media/user_None/pic/1602764174.8516657_ProfiePic.png
}

**1st Issue**
**配置文件pic保存在文件夹user\u none中,但它应该保存在user{user.id}中,如文件pic函数中所述。其想法是将与用户相关的所有内容保存在一个文件夹中

 {
        "profile_pic": "http://localhost:8000/media/user_None/pic/1602764174.8516657_ProfiePic.png",
        "first_name": "Ram",
        "last_name": "Verma",
        "username": "ramverma",
        "url": "http://localhost:8000/api/teacher/23"
    }
第二期 若POST请求中未给出配置文件pic,则配置文件_pic值将设置为null,而不是模型中ImageField中提供的默认值


当API交互完成时,这两个问题都会发生。在web交互中,这个问题不会持续下去。如果您想访问对象id,您必须先保存它(),因为之前无法知道它。然后可以通过调用来更新ImageField

我不确定默认图像的问题