2015-06-22 89 views
0

我有一個模板,顯示一個窗體與2個模型的數據。這兩個模型都包含一個名爲「name」的屬性。問題是,當我保存時,表單中「name」的錯誤值將保存爲appuser模型。我如何才能爲「名稱」字段的兩個表單中的每一個獲得正確的值?Django字段名稱衝突保存

視圖中看到(#ISSUE)

class FarmCreateView(CreateView): 
     template_name = 'directory/farm_registration.html' 
     model = Appuser 
     success_url = '/' 

     def get_context_data(self, **kwargs): 
      context = super(FarmCreateView, self).get_context_data(**kwargs) 
      context['farm'] = FarmForm() 
      context['appuser'] = FarmUserCreateForm() 
      return context 

     def post(self, request, *args, **kwargs): 
      farm_form = FarmForm(self.request.POST) 
      appuser_form = FarmUserCreateForm(self.request.POST) 

      if farm_form.is_valid() and appuser_form.is_valid(): 
       # Save the appuser 
       new_user = appuser_form.save(commit=False) 
       new_user.name = appuser_form.cleaned_data.get('name') 

# ISSUE I would expect the line above to return the name from the 
# appuser_form, but instead it return the name from the farm_form 
       new_user.save() 

       # Save the farm 
       new_farm = farm_form.save(commit=False) 
       new_farm.appuser = new_user; 
       new_farm.save() 
       farm_form.save_m2m() # This is needed because we 
# initially save with commit=false - it's just the way django works 

       # Log user in after registration 
       new_user_login = authenticate(email=request.POST['email'], 
        password=request.POST['password']) 
       login(request, new_user_login) 

       return HttpResponseRedirect('/') 
      else: 
       return render_to_response('directory/farm_registration.html', {'farm': 
        farm_form, 'appuser': appuser_form}, 
        context_instance=RequestContext(request)) 

模板提取

<div class="pure-g"> 
    <div class="pure-u-1-2 {{appuser.name.css_classes}}" style="margin-bottom: 20px;">{{appuser.name}}</div> 
    <div class="pure-u-1-2 {{appuser.surname.css_classes}}"><div style="float:right;">{{appuser.surname}}</div></div> 
<div class="pure-u-1-2 {{appuser.email.css_classes}}" style="margin-bottom: 20px;">{{appuser.email}}</div> 
    <div class="pure-u-1-2 {{appuser.phone_number.css_classes}}"><div style="float:right;">{{appuser.phone_number}}</div></div> 
    <div class="pure-u-1-2 {{appuser.password.css_classes}}" style="margin-bottom: 20px;">{{appuser.password}}</div> 
    <div class="pure-u-1-2 {{appuser.password1.css_classes}}"><div style="float:right;">{{appuser.password1}}</div></div> 
</div> 
<!-- Farm Info --> 
<div style="height:28px; position:relative; text-align:center; margin-bottom:10px; margin-left:1px; margin-right:1px"> 
<div class="page_section_strikethrough"></div>  
    <div class="page_section_heading" style="background:rgb(246,246,246)">FARM INFO</div> 
</div> 
    <div class="pure-g"> 
    <div class="pure-u-1-1 {{farm.name.css_classes}}" style="margin-bottom: 20px;">{{farm.name}}</div> 
+0

使用'prefix'的形式,這樣'上下文[ '農場'] = FarmForm(前綴= 「farm_form」)'和'FarmUserCreateForm(前綴='farm_user_create')' –

+0

@AmitYadav謝謝,工作,如果你給你的評論作爲答案我會接受 – RunLoop

+0

我很高興它的工作,現在你應該讀什麼前綴做到你的表格 –

回答

1

使用前綴,像這樣:

context['farm'] = FarmForm(prefix="farm_form") 
context['appuser'] = FarmUserCreateForm(prefix='farm_user_create') 
0

檢查name屬性中所呈現的形式,特別是那些用於{{ appuser.name }}{{ farm.name }}的輸入元件。

我想他們是一樣的,因爲我不認爲在渲染模板中會出現命名空間。因此,將有兩個<input name="name" ...>元素,並且在POST上,將會覆蓋另一個元素。

因此,當您在post(...)方法內創建綁定表單時,需要填寫具有相同名稱的兩個表單。您可以通過在運行開發服務器時打印self.request.POST的值來驗證後者:您應該只能看到一個name密鑰。在形式

+0

謝謝,但我怎麼能防止/解決這個問題? – RunLoop

+0

在表單中給他們一個不同的名字?只需將您的Form類中的相應屬性重命名爲'appuser_name'和'farm_name'。 – Evert