Python Django URLField ErrorDetail“;请输入有效的URL";

Python Django URLField ErrorDetail“;请输入有效的URL";,python,django,django-rest-framework,Python,Django,Django Rest Framework,我目前正在为一个客户端开发一个webApp。我从未使用过URLField,因为我总是在JS中使用自己的URL验证程序,但这次我想使用它。问题是,当我测试应用程序时,我传递的url如下: 测试.py class Mision(models.Model): img = models.ImageField(upload_to="misiones", storage=OverwriteStorage(), default="noticias/tanque_arma3.j

我目前正在为一个客户端开发一个webApp。我从未使用过URLField,因为我总是在JS中使用自己的URL验证程序,但这次我想使用它。问题是,当我测试应用程序时,我传递的url如下:

测试.py

class Mision(models.Model):
  img = models.ImageField(upload_to="misiones", storage=OverwriteStorage(), default="noticias/tanque_arma3.jpg")
  usuario = models.ForeignKey(Usuario, related_name="mision", default=None, blank=False, on_delete=models.SET_DEFAULT)
  fecha = models.DateTimeField(auto_now_add=True)
  titulo = models.CharField(max_length=200, null=False, blank=False)
  subtitulo = models.CharField(max_length=200, blank=True)
  url = models.URLField(max_length=200, blank=True)
class MisionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Mision
        fields = '__all__'
@api_view(["POST"])
def misionCreate(request):
    serializer = MisionSerializer(data=request.data)
    data = {}
    if serializer.is_valid():
        if request.user.is_superuser:
            serializer.save()
            mision = Mision.objects.get(id = serializer.data["id"])
            data["success"] = "Mision Creada con exito!"
            data["status"] = 200
            data["mision"] = serializer.data
            return Response(data, status=status.HTTP_200_OK)
        
        elif not request.user.is_superuser:
            data["error"] = "El usuario no es superuser."
            data["status"] = 401
            return Response(data, status=status.HTTP_401_UNAUTHORIZED)

        else:
            data["error"] = "El usuario no tiene tokens."
            data["status"] = 401
            return Response(data, status=status.HTTP_401_UNAUTHORIZED)
            
    else:
        data["error"] = serializer.errors
        data["status"] = 422
        return Response(data, status=status.HTTP_422_UNPROCESSABLE_ENTITY)
url=”https://www.youtube.com/watch?v=9P1HtbpGSCk"
数据={…,“img”:img,“url”:url}
response=client\u superuser.post(url、数据、格式=“多部分”)
此错误排列为:

{'error': {'url': [ErrorDetail(string='Please enter a valid URL.', code='invalid')]}, 'status': 422}
我也尝试了不同的网址,但没有改变。 阅读其他问题,比如,我意识到本地测试可能是一个问题,这就是我正在做的

url=models.URLField(验证是否存在=False)
或者,换句话说,我怎样才能关闭URL验证程序呢?也许有一个没有验证程序的URL字段是愚蠢的,但我不明白Django文档如何正确地禁用一些验证程序

型号.py

class Mision(models.Model):
  img = models.ImageField(upload_to="misiones", storage=OverwriteStorage(), default="noticias/tanque_arma3.jpg")
  usuario = models.ForeignKey(Usuario, related_name="mision", default=None, blank=False, on_delete=models.SET_DEFAULT)
  fecha = models.DateTimeField(auto_now_add=True)
  titulo = models.CharField(max_length=200, null=False, blank=False)
  subtitulo = models.CharField(max_length=200, blank=True)
  url = models.URLField(max_length=200, blank=True)
class MisionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Mision
        fields = '__all__'
@api_view(["POST"])
def misionCreate(request):
    serializer = MisionSerializer(data=request.data)
    data = {}
    if serializer.is_valid():
        if request.user.is_superuser:
            serializer.save()
            mision = Mision.objects.get(id = serializer.data["id"])
            data["success"] = "Mision Creada con exito!"
            data["status"] = 200
            data["mision"] = serializer.data
            return Response(data, status=status.HTTP_200_OK)
        
        elif not request.user.is_superuser:
            data["error"] = "El usuario no es superuser."
            data["status"] = 401
            return Response(data, status=status.HTTP_401_UNAUTHORIZED)

        else:
            data["error"] = "El usuario no tiene tokens."
            data["status"] = 401
            return Response(data, status=status.HTTP_401_UNAUTHORIZED)
            
    else:
        data["error"] = serializer.errors
        data["status"] = 422
        return Response(data, status=status.HTTP_422_UNPROCESSABLE_ENTITY)
序列化程序.py

class Mision(models.Model):
  img = models.ImageField(upload_to="misiones", storage=OverwriteStorage(), default="noticias/tanque_arma3.jpg")
  usuario = models.ForeignKey(Usuario, related_name="mision", default=None, blank=False, on_delete=models.SET_DEFAULT)
  fecha = models.DateTimeField(auto_now_add=True)
  titulo = models.CharField(max_length=200, null=False, blank=False)
  subtitulo = models.CharField(max_length=200, blank=True)
  url = models.URLField(max_length=200, blank=True)
class MisionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Mision
        fields = '__all__'
@api_view(["POST"])
def misionCreate(request):
    serializer = MisionSerializer(data=request.data)
    data = {}
    if serializer.is_valid():
        if request.user.is_superuser:
            serializer.save()
            mision = Mision.objects.get(id = serializer.data["id"])
            data["success"] = "Mision Creada con exito!"
            data["status"] = 200
            data["mision"] = serializer.data
            return Response(data, status=status.HTTP_200_OK)
        
        elif not request.user.is_superuser:
            data["error"] = "El usuario no es superuser."
            data["status"] = 401
            return Response(data, status=status.HTTP_401_UNAUTHORIZED)

        else:
            data["error"] = "El usuario no tiene tokens."
            data["status"] = 401
            return Response(data, status=status.HTTP_401_UNAUTHORIZED)
            
    else:
        data["error"] = serializer.errors
        data["status"] = 422
        return Response(data, status=status.HTTP_422_UNPROCESSABLE_ENTITY)
视图.py

class Mision(models.Model):
  img = models.ImageField(upload_to="misiones", storage=OverwriteStorage(), default="noticias/tanque_arma3.jpg")
  usuario = models.ForeignKey(Usuario, related_name="mision", default=None, blank=False, on_delete=models.SET_DEFAULT)
  fecha = models.DateTimeField(auto_now_add=True)
  titulo = models.CharField(max_length=200, null=False, blank=False)
  subtitulo = models.CharField(max_length=200, blank=True)
  url = models.URLField(max_length=200, blank=True)
class MisionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Mision
        fields = '__all__'
@api_view(["POST"])
def misionCreate(request):
    serializer = MisionSerializer(data=request.data)
    data = {}
    if serializer.is_valid():
        if request.user.is_superuser:
            serializer.save()
            mision = Mision.objects.get(id = serializer.data["id"])
            data["success"] = "Mision Creada con exito!"
            data["status"] = 200
            data["mision"] = serializer.data
            return Response(data, status=status.HTTP_200_OK)
        
        elif not request.user.is_superuser:
            data["error"] = "El usuario no es superuser."
            data["status"] = 401
            return Response(data, status=status.HTTP_401_UNAUTHORIZED)

        else:
            data["error"] = "El usuario no tiene tokens."
            data["status"] = 401
            return Response(data, status=status.HTTP_401_UNAUTHORIZED)
            
    else:
        data["error"] = serializer.errors
        data["status"] = 422
        return Response(data, status=status.HTTP_422_UNPROCESSABLE_ENTITY)

感谢@AbdulAzizBarkat,这让我意识到我使用了两个名为“url”的变量,所以我只需将这些变量更改为两个不同的名称,现在就可以工作了

错误

url = reverse('api:mision-create')
url= "https://www.youtube.com/watch?v=9P1HtbpGSCk"

data = {'usuario': usuario.pk, "titulo":"test", "subtitulo":"test", "img": img, "url":url}
response = client_superuser.post(url, data,format="multipart")

已解决:

url = reverse('api:mision-create')
url_field= "https://www.youtube.com/watch?v=9P1HtbpGSCk"

data = {'usuario': usuario.pk, "titulo":"test", "subtitulo":"test", "img": img, "url":url_field}
response = client_superuser.post(url, data,format="multipart")


您可以共享您的模型、序列化程序、视图等吗?可以@WillemVanOnsem@MatiasCoco顺便问一下,你确定你发布到了正确的url吗
client\u superuser.post(url,data,format=“multipart”)
就在这一行上面(至少如您所示),您已经编写了
url=”https://www.youtube.com/watch?v=9P1HtbpGSCk“
所以你可能真的想把数据发布到youtube上……哈哈哈,你是对的,我从来没有意识到我使用了两个同名变量,谢谢@AbdulAzizBarkat!