2012-07-26 27 views
31

No puedo encontrar ninguna solución a mi problema con un tipo similar de error.objeto no tiene atributo 'obtener'

El error es cuando intento editar objeto:

objeto 'intención' no tiene atributo 'conseguir'

lo tengo en línea con form.as_p:

{% extends "layout.html" %} 
{% block content %} 
    <form action="{{ form_url }}" method="post">{% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Submit" /> 
    </form> 
{% endblock %} 
código

controlador:

def edit(request, id): 
    if request.method == 'POST': # If the form has been submitted... 
     form = IntentionForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): # All validation rules pass 
      # Process the data in form.cleaned_data 
      # ... 
      intention = form.save() 
      return HttpResponseRedirect(reverse_lazy('intention-show', args=[intention.id])) # Redirect after POST 
    else: 
     intention = Intention.objects.get(pk=id) 
     form = IntentionForm(intention) # An unbound form 

    return render_to_response('intentions/templates/form.html', 
           {'form': form, 'form_url': reverse_lazy('intention-edit', args=[intention.id])}, 
           context_instance=RequestContext(request) 
          ) 

¿Podría alguien darme algún consejo?

Trackback:

Environment: 


Request Method: GET 
Request URL: http://127.0.0.1:8000/intentions/3/edit 

Django Version: 1.4 
Python Version: 2.7.3 
Installed Applications: 
('django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'intentions', 
'django.contrib.admin') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware') 


Template error: 
In template /home/marek/devel/django/prayer/intentions/templates/form.html, error at line 4 
    'Intention' object has no attribute 'get' 
    1 : {% extends "layout.html" %} 


    2 : {% block content %} 


    3 : <form action="{{ form_url }}" method="post">{% csrf_token %} 


    4 : {{ form.as_p }} 


    5 : <input type="submit" value="Submit" /> 


    6 : </form> 


    7 : {% endblock %} 


    8 : 

Traceback: 
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/home/marek/devel/django/prayer/intentions/views.py" in edit 
    55.         context_instance=RequestContext(request) 
File "/usr/local/lib/python2.7/dist-packages/django/shortcuts/__init__.py" in render_to_response 
    20.  return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/template/loader.py" in render_to_string 
    176.   return t.render(context_instance) 
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render 
    140.    return self._render(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in _render 
    134.   return self.nodelist.render(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render 
    823.     bit = self.render_node(node, context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node 
    74.    return node.render(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py" in render 
    123.   return compiled_parent._render(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in _render 
    134.   return self.nodelist.render(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render 
    823.     bit = self.render_node(node, context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node 
    74.    return node.render(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py" in render 
    62.    result = block.nodelist.render(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in render 
    823.     bit = self.render_node(node, context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render_node 
    74.    return node.render(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/debug.py" in render 
    84.    output = self.filter_expression.resolve(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in resolve 
    571.     obj = self.var.resolve(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in resolve 
    721.    value = self._resolve_lookup(context) 
File "/usr/local/lib/python2.7/dist-packages/django/template/base.py" in _resolve_lookup 
    772.        current = current() 
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in as_p 
    238.    errors_on_separate_row = True) 
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in _html_output 
    143.   top_errors = self.non_field_errors() # Errors that should be displayed above all fields. 
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in non_field_errors 
    246.   return self.errors.get(NON_FIELD_ERRORS, self.error_class()) 
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in _get_errors 
    115.    self.full_clean() 
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in full_clean 
    270.   self._clean_fields() 
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in _clean_fields 
    281.    value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) 
File "/usr/local/lib/python2.7/dist-packages/django/forms/widgets.py" in value_from_datadict 
    205.   return data.get(name, None) 

Exception Type: AttributeError at /intentions/3/edit 
Exception Value: 'Intention' object has no attribute 'get' 
+1

Sí. Publica el rastreo completo. –

+0

He editado la pregunta – keram

+0

-1 sin comentarios ¿por qué? – keram

Respuesta

59

Su problema está aquí:

intention = Intention.objects.get(pk=id) 
form = IntentionForm(intention) # An unbound form 

El primer argumento de una forma son los datos, sino que están pasando la instancia. Para pasar adecuadamente la instancia se debe utilizar:

intention = Intention.objects.get(pk=id) 
form = IntentionForm(instance=intention) # An unbound form 
+3

cómo podría haberme perdido eso, he leído la documentación 10 veces https://docs.djangoproject.com/en/dev/topics/forms/modelforms/ – max4ever

15

La respuesta anterior es correcta, sin embargo, este error puede también ser generado por los argumentos que pasan de forma incorrecta en el init de un formulario, que se utiliza para un modelo de administración .

Ejemplo:

class MyForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
    super(MyForm, self).__init__(self, *args, **kwargs) 

Aviso el doble paso del auto? Debe ser:

class MyForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
    super(MyForm, self).__init__(*args, **kwargs) 
+6

Live long you man. Gracias. Tuve un error tipográfico similar con el argumento del host. – Jay

+3

Acabo de buscar durante horas para encontrar esta respuesta que me insinúa tener un problema similar.¡Gracias un montón! –

+1

este fue mi caso, gracias hombre! – Antiphon0x

1

En Django, tenga cuidado de cómo nombra sus vistas y modelos.

En mi caso, he tenido esto en models.py:

class Contact(models.Model): 
    ... 

En views.py, tuve:

def contact(request): 
    ... 

Luego, en urls.py, que tenía:

from .views import Contact 

Así , En realidad estaba importando la clase de modelo, y no la función de contacto, por lo que mi error wa s:

'Contact' object has no attribute 'get' 

Ese objeto no tiene el atributo get. Se supone que debe venir de views.py, no de model.

Cuestiones relacionadas