2013-01-04 68 views
0

我想保存的ModelForm,但我得到一個錯誤:Django - 如何保存()ModelForm的?

InternalError at /submeter/anuncio/ 
current transaction is aborted, commands ignored until end of transaction block 

我會盡量解釋我在做什麼。

好吧,我有5個模型,我需要一次以一種形式保存。我正在測試以保存兩個模型,但正如我所說的,我在保存方法中遇到了錯誤。作爲一名初學者,我在實現這一任務的最佳方式上有點失落。

我所做的:

模板:

<form method="post" action="/submeter/anuncio/">{% csrf_token %} 
    {{form_main}} 
    {{form_bicyclead}} 
    <input type="hidden" name="section" value="5" /> 
    <input type="submit"> 
</form> 

Views.py:

def submit_data_entry_view(request): 
    if request.method == 'GET': #first time rendering the form 
    form_main  = MainForm() 
    form_bicyclead = BicycleAdForm() 

    return render_to_response('app_t/submit_data_entry.html', {'form_main': form_main, 'form_bicyclead': form_bicyclead}, context_instance=RequestContext(request)) 

def submit_ad_view(request): 
    if request.method == 'POST': 
     post_values = request.POST.copy() 

     post_values['user'] = request.user.username 

     post_values['bicycleadtype']  = 2 
     post_values['bicycleaditemkind'] = 4 
     post_values['bicycleadcondition'] = 2 
     post_values['city']    = 4803854 

     form_main  = MainForm(post_values) 
     form_bicyclead = BicycleAdForm(post_values) 

    if form_main.is_valid() and form_bicyclead.is_valid(): 
     form_main.save() 
     #form_bicyclead.save() 

     resultado = 'valid' 
    else: 
     resultado = 'n_valid' 
    pdb.set_trace() 

    return render_to_response('app_t/submit_ad.html', {'resultado': resultado}, context_instance=RequestContext(request)) 

Forms.py:

class MainForm(forms.ModelForm): 
    class Meta: 
    model = Main 
    exclude = ('user', 'section') 

class BicycleAdForm(forms.ModelForm): 
    class Meta: 
    model = BicycleAd 
    exclude = ('main', 'bicycleadtype', 'bicycleaditemkind', 'bicycleadcondition', 'city') 

Models.py:

class Main(models.Model): 
    section    = models.ForeignKey(Section) 
    user    = models.ForeignKey(User) 
    title    = models.CharField(max_length=250) 
    date_inserted  = models.DateTimeField(auto_now_add=True) 
    date_last_update = models.DateTimeField(auto_now=True) 

    def __unicode__(self): 
    return self.title 

    class Meta: 
    ordering = ['date_inserted'] 

class BicycleAd(models.Model): 
    main    = models.ForeignKey(Main) 
    bicycleadtype  = models.ForeignKey(BicycleAdType) 
    bicycleaditemkind = models.ForeignKey(BicycleAdItemKind) # MPTT Model 
    bicycleadcondition = models.ForeignKey(BicycleAdCondition) 
    country    = models.ForeignKey(GeonamesCountry)  
    city    = models.ForeignKey(GeonamesLocal) 
    date_inserted  = models.DateTimeField(auto_now_add=True) 
    date_last_update = models.DateTimeField(auto_now=True) 

    class Meta: 
    ordering = ['date_inserted'] 

我的問題是:如何「覆蓋」views.py中的form_main.save()並告訴他們模型中的所有字段「section,user and title」?我認爲錯誤是由於沒有傳遞給保存方法的字段「部分」和「用戶」。我如何傳遞這個值?

另一個問題:我正在以正確的方式做到這一點,或者有更簡單更容易的方法來實現我想要實現的目標?

問候

回答

2

我的方法是替換此代碼:

def submit_ad_view(request): 
    if request.method == 'POST': 
     post_values = request.POST.copy() 

     post_values['user'] = request.user.username 

     post_values['bicycleadtype']  = 2 
     post_values['bicycleaditemkind'] = 4 
     post_values['bicycleadcondition'] = 2 
     post_values['city']    = 4803854 

     form_main  = MainForm(post_values) 

由:

def submit_ad_view(request): 
    if request.method == 'POST': 

     model = Main() #if model exists get it! 
         #Notice, Main is the name of your model. 

     model.user = request.user.username 
     ... 
     model.bicycleaditemkind = 4 
     ...   
     form_main  = MainForm(request.POST, instance = model) 

您可以瞭解更多關於Creating forms from models Django的文檔。

+0

謝謝你的回答。它解決了這個問題。謝謝! –

2

修改模型形式爲:

class MainForm(forms.ModelForm): 
    def __init__(self, *args, **kw): 
     self.user = kw.pop('user') 
     self.section = kw.pop('section') 
     super(MainForm).__init__(*args, **kw) 

    class Meta: 
     model = Main 
     exclude = ('user', 'section') 

    def save(self, *args, **kw): 
     instance = super(MainForm).save(commit=False) 
     instance.user = self.user 
     instance.section = self.section 
     instance.save() 
     return instance 

現在,你需要通過usersection當你正在創建的形式在您的視圖的intance:

form_main = MainForm(request.POST or None, user=request.user, section=section) 
+2

我想你的意思是'self.section = kw.pop('section')' – trpt4him

+1

@ trpt4him謝謝,這是一個錯字:) –

+0

謝謝你的回答。它也會做這項工作。 –

相關問題