2013-08-21 46 views
8

Tôi đang gặp khó khăn khi truy cập dữ liệu được gửi qua bộ định dạng của tôi. Đây là mã của tôi:Django truy cập dữ liệu định dạng

mẫu:

<form action="" method="post"> 
    {% csrf_token %} 
    {{ formset.management_form }} 
    {% for form in formset %} 

    {{ form.as_p }} 

    {% endfor %} 

    <input type="submit" value="Submit"> 

</form> 

Xem:

def addMembers(request, id, members): 
    if request.user.is_authenticated(): 
     members = int(members) 
     MemberFormSet = formset_factory(MemberForm, extra = members) 
     if request.method == 'POST': 
      print 'post' 
      formset = MemberFormSet(request.POST) 
      if formset.is_valid(): 
       cd = formset.cleaned_data 
       for f in formset: 
        first_name = cd.first_name 
        last_name = cd.last_name 
        email = cd.email 
        house = House.objects.get(id = id) 
        member = Member(first_name = first_name, last_name = last_name, email = email, house = house, created_on = timezone.now()) 
        member.save() 
       return HttpResponseRedirect(reverse('houses:controlPanel')) 
     else: 
      formset = MemberFormSet() 
     return render_to_response('houses/add_members.html', {'formset' : formset}, context_instance = RequestContext(request)) 
    return HttpResponseRedirect(reverse('allauth.account.views.login')) 

Tôi đã thử nhiều cách để truy cập vào dữ liệu sang một bên từ những gì hiện đang viết bao gồm: f['attribute'] cd['attribute'] request.POST['attribute'] formset.cleaned_data['attribute']

Tôi nhận được các lỗi khác nhau, từ u"Key 'email' not found in Form" đến list indices must be integers, not str

Tôi nên truy cập dữ liệu được gửi bởi một bộ định dạng như thế nào? Tài liệu của Django không đưa ra câu trả lời rõ ràng cho điều này và tìm kiếm xung quanh tôi tìm thấy nhiều cách khác nhau nhưng không có cách nào làm việc được. Cảm ơn bạn đã giúp đỡ.

Trả lời

15

cd là từ điển. Ngoài ra, bạn có thể muốn lấy các giá trị từ điển từ hình thức cá nhân chứ không phải là formset

if request.method == 'POST': 
    formset = MemberFormSet(request.POST) 
    if formset.is_valid(): 
     for f in formset: 
      cd = f.cleaned_data 
      first_name = cd.get('first_name') 
      last_name = cd.get('last_name') 
      email = cd.get('email') 
      house = House.objects.get(id = id) 
      member = Member(first_name = first_name, last_name = last_name, email = email, house = house, created_on = timezone.now()) 
      member.save() 
     return HttpResponseRedirect(reverse('houses:controlPanel')) 
+0

Bạn không cần phải kiểm tra 'f.is_valid()'. Một bộ định dạng không hợp lệ trừ khi tất cả biểu mẫu của nó cũng hợp lệ. –

+0

@PeterDeGlopper Bạn đang phải – karthikr

+0

bất kỳ cách nào để kiểm tra điều này trước khi is_valid? – radtek

0

Tôi nghĩ rằng bạn nên sử dụng một model_formsetfactory, hoặc thậm chí tốt hơn, một inlineformset_factory. Bạn đang phổ biến các mô hình từ dữ liệu biểu mẫu, đó là những gì chúng được thiết kế cho. Lấy các mô hình bẩn từ formset, sử dụng commit = False, và thêm vào mối quan hệ House của bạn. Một cái gì đó như thế này:

MemberFormSet = model_formset_factory(Member, extra= members) 
if request.method == POST: 
    formset = MemberFormSet(request.POST) 
    if formset.is_valid(): 
     house = House.objects.get(id = id) 
     models = formset.save(commit=False) 
     for member in models: 
      member.house = house 
      member.save() 
     return render(<your data>) 
else: 
    formset = MemberFormSet() 
return render(<your data>) 

Lưu ý get() của bạn cũng sẽ ném ngoại lệ nếu đối tượng House không tồn tại. Chỉ cần xem xét thiết kế.

Các vấn đề liên quan