2011-06-30 10 views
3

モデルにOneToOneFieldがあるモデルにDjango管理サイトが提供する機能を真似てみたいと思います。OneToOneFieldはOneToOneモデルのフォームに入力するオプションです。そのフィールドのフォームは常に表示されますが、空の場合はOneToOneFieldのオブジェクトは作成されず、メインオブジェクトのみが作成または変更されます。 OneToOneFieldオブジェクトが作成されたときにのみ有効になる、削除チェックボックスもあります。これがチェックされ、saveを押すと、OneToOneオブジェクトは削除されますが、メインオブジェクトは保持されます。django管理者のOneToOneFieldオプションフォームを模倣する方法

関与モデル:1製品であり、ビールであることを起こる場合は、他の1は、製品のための余分な情報です:

class Producto(models.Model): 
    nombre = models.CharField(max_length=100, blank=False) 

class Cerveza(models.Model): 
    producto = models.OneToOneField(Producto) 

これは私がビューをどうしようとしたものです。

class ProductoForm(ModelForm): 
    class Meta: 
     from pdv.models import Producto 
     model = Producto 

class CervezaForm(ModelForm): 
    class Meta: 
     from pdv.models import Cerveza 
     model = Cerveza 

そして、これは私が両方を表示するために管理する方法である:

def productomodificar(request, producto_id): 
    from django.forms.models import inlineformset_factory 
    from pdv.models import Producto, Cerveza 
    from pdv.forms import ProductoForm, CervezaForm 

    ProductoFormSet = inlineformset_factory(Producto, Cerveza, can_delete=True, form=CervezaForm) 

    alerta = None 
    producto = get_object_or_404(Producto, pk=producto_id) 
    if request.user.is_staff: 
     if request.method == 'POST': 
      form = ProductoForm(request.POST, instance=producto) 
      cervezaform = ProductoFormSet(request.POST, instance=producto) 
      if form.is_valid(): 
       if cervezaform.is_valid(): 
        form.save() 
        cervezaform.save() 
        alerta = "Producto modificado exitosamente" 
       else: 
        alerta = "Error al modificar datos de cerveza" 
      else: 
       alerta = "Error al modificar producto" 

     else: 
      form = ProductoForm(instance=producto) 
      cervezaform = ProductoFormSet(instance=producto) 
      getm = request.GET.get('m', None) 
      if getm == '1': 
       alerta = "Producto creado exitosamente" 
    else: 
     alerta = "No tienes permiso para editar productos" 
     form = producto 
    c = {"user": request.user, "titulo": "Administrar Producto", "form": form, "cervezaform":cervezaform, "alerta":alerta} 
    c.update(csrf(request)) 
    return render_to_response("productomodificar.html",c) 

これらは私の関与形態でありますテンプレート内のフォーム:

<form method="post" action="">{% csrf_token %} 
    <table> 
     {{ form.as_table }} 
     {{ cervezaform.as_table }} 
     <tr> 
      <th></th> 
      <td><input type="submit" value="Guardar" /></td> 
     </tr> 
    </table> 
</form> 

しかし、まだ、問題は私がOneToOneフォーム(Cerveza)を記入していない場合、私は製品を追加することはできませんということです。だから、空にすることはできません。私はOneToOneフォームを削除しようとする場合にも、私はこのメッセージが表示されます。

(Hidden field id) Select a valid choice. That choice is not one of the available choices. 

残念ながら、私は、オプションのOneToOneFieldするためのフォームを作成する方法の良い例を見つけると、それを使用することができていませんカスタムテンプレート。オプションのonetooneオブジェクトを作成した後http://i.imgur.com/p3P6s.png

:オプションのonetooneオブジェクトを追加する前に

http://i.imgur.com/UEcm8.png

私は本当に意志私はここではDjangoのadminにどのように動作するかの2つの例をあなたを残し

助けをありがとう。前もって感謝します。

答えて

1

コードを完全に機能させるには、小さなものを1つ変更する必要があります。フォームをPOSTしてデータを保存した後、フォームを再度表示するのではなく、どこかにリダイレクトする必要があります。置き換えますと

alerta = "Producto modificado exitosamente" 

from django.shortcuts import redirect 
    return redirect('my_view') 

(あなたがreturn redirect('pdv.views.productomodificar', prodcuto.id)でフォームに戻ってリダイレクトすることができます)

+0

ありがとうございました。これは私が必要としていた答えでした。 HttpResponseRedirect( "/ producto /%s /"%producto.id) このように、私はIDエラーを処理する必要はなく、OneToOneFieldは実際に更新または削除されます。 私はあなたの答えをupvoteできない場合、私は十分な評判を持っていない私を許してください。 –

+0

参照:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 – Udi

関連する問題