Django getting(AttributeError:';str';对象在提交表单后没有属性';get';)
我最近在学习django,遇到了一个问题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
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']))