[英]Add Foreign Model in other form model - Django 1.8
當我嘗試以AgregarActividad形式添加異物'linea'時,在Django中出現錯誤
views.py
@login_required(login_url='/')
def agregar_actividad(request, pk):
linea = Linea.objects.filter(pk=pk)
if request.method == "POST":
form = AgregarActividad(request.POST, linea = linea)
if form.is_valid():
actividad = form.save(commit=False)
actividad.save()
return redirect('/lineas/lista')
else:
form = AgregarLinea()
return render(request, 'lineas/editar_actividad.html', {'form': form})
表格
class AgregarActividad(forms.ModelForm):
class Meta:
model = Actividad
fields = '__all__'
exclude = ['updated']
def __init__(self, *args, **kwargs):
linea = kwargs.pop('linea')
print linea
super(AgregarActividad, self).__init__(*args,**kwargs)
self.fields['descripcion'].required = True
self.fields['linea'] = linea
models.py
class Actividad(models.Model):
class meta:
verbose_name_plural = "Actividades"
descripcion = models.CharField(max_length=75, unique=True)
linea = models.ForeignKey('Linea')
updated = models.DateTimeField(auto_now_add=False, auto_now=True, null=True)
def __str__(self):
return self.descripcion
agregar_actividad.html
{% extends 'base/base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<div class="col-sm-6 col-sm-offset-3">
<h1>Nueva Actividad</h1>
<form method = "POST" class="post-form">
{% csrf_token %}
{{ form|crispy }}
<input class="btn btn-default" type="submit" value="Submit"> <!-- Boton para subir POSTEAR LOS DATOS -->
</form>
</div>
{% endblock %}
引發我的錯誤
AttributeError at /linea/19/actividad/agregar/
'QuerySet' object has no attribute 'widget'
Request Method: POST
Request URL: http://localhost:8000/linea/19/actividad/agregar/
Django Version: 1.8.5
Exception Type: AttributeError
Exception Value:
'QuerySet' object has no attribute 'widget'
追溯
/home/daniel/DjangoProjects/Speeducation/Speeducation/apps/lineas/views.py in agregar_actividad
if form.is_valid():
問題是您表格中的這一行
self.fields['linea'] = linea
用這樣的查詢集或對象替換字段是沒有意義的。
而是從表單中排除該字段
class AgregarActividad(forms.ModelForm):
class Meta:
model = Actividad
fields = '__all__'
exclude = ['updated', 'linea']
在視圖中,保存之前分配對象。 注意,您應該使用get()
而不是filter()
來獲取單個對象。
linea = Linea.objects.get(pk=pk)
if request.method == "POST":
form = AgregarActividad(request.POST, linea = linea)
if form.is_valid():
actividad = form.save(commit=False)
actividad.linea = linea
actividad.save()
return redirect('/lineas/lista')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.