モデルに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オブジェクトを追加する前に
私は本当に意志私はここではDjangoのadminにどのように動作するかの2つの例をあなたを残し
助けをありがとう。前もって感謝します。
ありがとうございました。これは私が必要としていた答えでした。 HttpResponseRedirect( "/ producto /%s /"%producto.id) このように、私はIDエラーを処理する必要はなく、OneToOneFieldは実際に更新または削除されます。 私はあなたの答えをupvoteできない場合、私は十分な評判を持っていない私を許してください。 –
参照:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 – Udi