Django getting(AttributeError:';str';对象在提交表单后没有属性';get';)

Django getting(AttributeError:';str';对象在提交表单后没有属性';get';),django,django-forms,Django,Django Forms,我最近在学习django,遇到了一个问题 Internal Server Error: /event_edit Traceback (most recent call last): File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner response = get_response(request) File &quo

我最近在学习django,遇到了一个问题

Internal Server Error: /event_edit
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python3.7/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/workspace/CalendarProject/cencal/views.py", line 107, in event_edit
    if form.is_valid():
  File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 185, in is_valid
    return self.is_bound and not self.errors
  File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 180, in errors
    self.full_clean()
  File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 381, in full_clean
    self._clean_fields()
  File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 393, in _clean_fields
    value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
  File "/usr/local/lib/python3.7/site-packages/django/forms/widgets.py", line 258, in value_from_datadict
    return data.get(name)
AttributeError: 'str' object has no attribute 'get'
执行
表单时出现此错误消息。是否有效()
,但我不知道问题出在哪里。表单字段值肯定没有问题

如果你需要任何额外的信息,我准备这样做

事件\u编辑视图

def event_edit(request, pk=None):
    pk2=0
    if pk==None:
        if request.method == "POST":
            pk2 = int(request.POST.get('pk', None))
        else:
            pk2 = int(request.GET.get('pk', None))
    else:
        pk2 = pk
    event = get_object_or_404(Event, pk=pk2)
    if request.method == "POST":
        form = EventForm(request.POST.get('form'))
        if form.is_valid():
            event = form.save(commit=False)
            event.author = request.user
            event.save()
            jsonres = JsonResponse({"res": "successful"})
            jsonres.status_code = 200
            return jsonres
            # return render(request, 'cencal/index.html', {'sidebarContent':render_to_string('cencal/detailevent.html', {'event': event})})
            # return redirect('detailevent', pk=event.pk)
        else:
            print(form.errors.as_json())
            jsonres = JsonResponse({"error": form.errors.as_json()})
            jsonres.status_code = 599
            return jsonres
    else:
        print("else")
        form = EventForm(instance=event)
        return render(request, 'cencal/eventform.html', {'form':form, 'edit':"true", 'pk':pk2})
提交表单的模板javascript函数

function makeEvent(event){
            event.preventDefault();
            var year = event.target.querySelector("#id_date").value.slice(0,4);
            var month = event.target.querySelector("#id_date").value.slice(5,7);
            var day = event.target.querySelector("#id_date").value.slice(8,10);
            var form = $("#eventform");
            $.ajax({
                type: form.attr('method'),
                url: form.attr('action'),
                data: {'form' : form.serialize(), 'pk' : form.attr("pk"), 'csrfmiddlewaretoken': '{{ csrf_token }}'},
                success: function(response){
                    console.log("makeEvent() successful");
                    console.log(response);
                    refreshCalendarAjax(year, month);                         
                    listevent(year, month, day);
                    //아래 메시지 make/edit별로 따로 출력해야 함.
                    document.getElementById("sidebar").insertAdjacentHTML( 'afterbegin', '<div class="info">일정 등록 성공!</div>' );
                },
                error: function(data){
                    if (data.status == 599) {
                        listevent(year, month, day);
                        errors = JSON.parse(data.responseJSON.error);
                        errors['__all__'].forEach(function(error){
                             document.getElementById("sidebar").insertAdjacentHTML( 'afterbegin', error['message'] );
                        })
                    } else {
                        alert("code:"+data.status+"\n"+"message:"+data.status+"\n"+"error:"+data.error);
                    }
                },
            });
        }
函数makeEvent(事件){
event.preventDefault();
var year=event.target.querySelector(“#id_date”).value.slice(0,4);
var month=event.target.querySelector(“#id_date”).value.slice(5,7);
var day=event.target.querySelector(“#id_date”).value.slice(8,10);
变量形式=$(“#事件形式”);
$.ajax({
类型:form.attr('method'),
url:form.attr('action'),
数据:{'form':form.serialize(),'pk':form.attr(“pk”),'csrfmiddlewaretoken':“{{csrf_-token}}”,
成功:功能(响应){
log(“makeEvent()成功”);
控制台日志(响应);
年份(年、月);
listevent(年、月、日);
//아래 메시지 制作/编辑별로 따로 출력해야 함.
document.getElementById(“侧栏”).insertAdjacentHTML('afterbegin','일정 등록 성공!' );
},
错误:函数(数据){
如果(data.status==599){
listevent(年、月、日);
errors=JSON.parse(data.responseJSON.error);
错误[''全部错误].forEach(函数(错误){
document.getElementById(“侧栏”).insertAdjacentHTML('afterbegin',error['message']);
})
}否则{
警报(“代码:“+data.status+”\n“+”消息:“+data.status+”\n“+”错误:“+data.error”);
}
},
});
}

Django表单需要一个类似字典的对象作为数据,如
请求.GET
请求.POST
,而不是字符串。因此,通常情况下,您使用以下内容构造表单:

form = EventForm(request.POST, request.FILES)

您可以共享视图吗?@WillemVanOnsem当然,请稍等片刻。通常您使用完整的
request.POST
,因此
EventForm(request.POST)
,而不是单个项目,因为这是一个字符串。您也可以共享表单(可能还有模板)吗?我上传了代码。您可能会对它们的名称差异感到困惑,但这是故意的。您需要使用
EventForm(QueryDict(request.POST['form']))
对其进行反序列化。它起作用了,我一定读过表单构造函数:(thx!
from django.http import QueryDict

# …

form = EventForm(QueryDict(request.POST['form']))