【问题标题】:django rest form not valid errordjango rest form 无效错误
【发布时间】:2017-06-14 00:12:10
【问题描述】:

我有一个模型,模型形式和视图如下:

@api_view(['POST'])
def addCigar(request):
    print(request.POST)
    form = CigarForm()
    if request.POST:
        form = CigarForm(request.POST)
        if form.is_valid():
            cigar.save()
            cigar = Cigar.objects.filter(id=cigar.id)
            serializer = CigarSerializer(cigar, many=True)
            return Response(serializer.data)
        else:
            return Response("Form not valid, insert correct fields.")

表格:

class CigarForm(ModelForm):
    class Meta:
        model = Cigar
        fields = ['brand','origin','shape', 'strength', 'aroma', 'notes', 'rating', ]

型号:

class Cigar(models.Model):
    brand = models.CharField(max_length=50, blank=False,)
    origin = models.CharField(max_length=30, blank=False,)
    shape = models.CharField(max_length=20, blank=False,)
    strength = models.CharField(max_length=20, blank=False,)
    aroma = models.CharField(max_length=20, blank=False,)
    notes = models.CharField(max_length=100, blank=False,)
    rating = models.IntegerField(null=True, )

我的 angular2 前端服务:

public addCigar(

    brand: string, 
    origin: string,
    shape: string,
    strength: string,
    aroma: string, 
    notes: string, 
    rating: number) {

    console.log("In service")
    let obj = new CigarModel(brand, origin, shape, strength, aroma, notes, rating);

    let body = JSON.stringify(obj);
    console.log(body)

    let headers = new Headers({ 'Content-Type': 'application/json; charset=utf-8' });
    let options = new RequestOptions({ headers: headers });
    return this.http.post(this.myUrl + 'api/cigar/add/', body, options)
    .toPromise()
    .then(response => response.json())
}

然而,这给了我表单无效错误。视图中的打印语句打印<QueryDict: {}>,服务正文中的console.log打印{"brand":"Nitish","origin":"India","shape":"Thin","strength":"Strong","aroma":"Wood","notes":"Good","rating":"4"}

我在这里做错了什么?我的前端或后端有问题吗?

更新:我现在使用 request.data 代替 request.POST

【问题讨论】:

  • 我看到的关于 body 的所有示例,对于 angular 2 都是这样的: var body = 'username=myusername&password=mypassword';尝试将您的 json 字符串转换为该字符串。 param1=value_param1&param2=value_param2 等
  • 有什么函数或参数可以这样转换吗?而不是 JSON.stringyfy()?
  • 你所有的导入都好吗?对于标题?
  • 您可以在 addCigar 函数中打印(请求)并向我们展示结果吗
  • 这就是我从浏览器控制台发送的请求:{"brand":"Nitish","origin":"Spain","shape":"Thin","strength":"Strong" “香气”:“木材”,“笔记”:“好”,“评级”:“4”}。 django 视图中的 Print(request.data) 给了我 {u'origin': u'India', u'rating': u'4', u'strength': u'Strong', u'brand': u'Nitish ', u'aroma': u'Wood', u'shape': u'Thin', u'notes': u'Good'}

标签: django angular django-rest-framework


【解决方案1】:

关注this example

创建一个 JSONResponse 类

class JSONResponse(HttpResponse):
    """
    An HttpResponse that renders its content into JSON.
    """
    def __init__(self, data, **kwargs):
        content = JSONRenderer().render(data)
        kwargs['content_type'] = 'application/json'
        super(JSONResponse, self).__init__(content, **kwargs)

您无需初始化表单即可验证您的数据。这是json内容。您需要使用您的序列化程序。

@api_view(['POST'])
def addCigar(request):
    if request.method == 'POST':
        serializer = CigarSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return JSONResponse(serializer.data, status=201)
        return JSONResponse(serializer.errors, status=400)

【讨论】:

  • 该函数是该类的一部分吗?还是分开的?还是 data=request.data?
  • 好的,它正在工作。我不得不将其更改为 data=request.data。你能解释一下为什么这个 JSONResponse 吗?因为在 DRF Response 中默认是 JSON,对吧?
  • 这个子类只返回 JSON 数据。 DRF 的响应方式默认不是 JSON。您需要定义content_typeSee the arguments here 您可以使用 Reponse,但您需要为您的数据定义更多参数。 (标题、状态、内容类型。)很高兴为您提供帮助
猜你喜欢
  • 1970-01-01
  • 2021-08-29
  • 2023-02-06
  • 2017-06-16
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 2020-12-19
  • 2018-03-28
相关资源
最近更新 更多