2011-01-24 81 views
1

該視圖拋出AttributeError說:'PhotoForm'對象沒有'保留'屬性。會發生什麼 - 函數通過,但實際上並沒有上傳圖像。在調試中,表單無效。Django:AttributeError - 對象沒有任何屬性

我試着打印

  • form.reservation
  • form.message
  • form.photo

但是,這顯示了該回溯(這就是爲什麼形式ISN」 t有效&未完成功能

As我從其他正在工作的函數中構建了它,我有點困惑。謝謝您的幫助!

HTML表單

<form action="/photo/new/" method="post">{% csrf_token %} 
    <dl> 
     <dt>{{ form.reservation.label }}</dt> 
      <dd><select name="reservation"> {% for reservation in reservations %} <option value="{{reservation.id}}">{{reservation.date}} {{reservation.chef.cook.get_profile.firstname}} - {{reservation.guest.get_profile.firstname}}</option>{% endfor %}</select></dd> 
     <dt>{{ form.photo.label }}</dt> 
      <dd>{{ form.photo }}</dd> 
     <dt> {{ form.message.label }}</dt> 
      <dd>{{ form.message }}</dd> 
    </dl> 
<button type="submit">Submit</button> 
</form> 

@login_required 
def new_photo(request, template_name="photo/newphoto.html"): 

    meals = Reservation.objects.filter(guest=request.user.id) 
    form = PhotoForm(request.POST) 
    form.data = { "reservations": meals } 
    if request.method == 'POST': 
    form.photographer = request.user 
    form.data.get('reservation') 
    print form.reservation 
    print form.message 
    print form.photo 
    if form.is_valid(): 
     print" hellos" 
     save_reservation_photo(request.FILES["photo"]) 
     photo = form.save(commit=False) 
     photo.photographer = request.user 
     photo.save() 
     return HttpResponseRedirect('/photo/%d/' % photo.id) 
    else: 
    form = PhotoForm() 

    data = {'form':form,'reservations':meals, 
    'add':True 
    } 

    return render_to_response(template_name, 
          data, 
          context_instance=RequestContext(request)) 

的形式爲:

class PhotoForm(forms.ModelForm): 
    class Meta: 
    model = Photo 
    fields = ('reservation','photo','message') 

    def __init__(self, *args, **kwargs): 
     super(PhotoForm, self).__init__(*args, **kwargs) 

該型號:

class Photo(models.Model): 

    photographer = models.ForeignKey(User) 
    pub_date = models.DateTimeField(default=datetime.now,auto_now_add=True,db_index=True) 
    reservation = models.ForeignKey(Reservation) 

    message = models.CharField(default='',max_length=140) 

    photo = models.ImageField(default='',upload_to="reservation_images/") 

回溯

Traceback: 
Environment: 

Request Method: POST 
Request URL: http://127.0.0.1:8000/photo/new/ 
Django Version: 1.2.3 
Python Version: 2.7.0 
Installed Applications: 
['django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.comments', 
'django.contrib.markup', 
'django.contrib.sitemaps', 
'lib.debug_toolbar', 
'src', 
'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', 
'lib.debug_toolbar.middleware.DebugToolbarMiddleware') 


Traceback: 

Environment: 

Request Method: POST 
Request URL: http://127.0.0.1:8000/photo/new/ 
Django Version: 1.2.3 
Python Version: 2.7.0 
Installed Applications: 
['django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.comments', 
'django.contrib.markup', 
'django.contrib.sitemaps', 
'lib.debug_toolbar', 
'src', 
'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', 
'lib.debug_toolbar.middleware.DebugToolbarMiddleware') 


Traceback: 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    100.      response = callback(request, *callback_args, **callback_kwargs) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 
    25.     return view_func(request, *args, **kwargs) 
File "/Users/emilepetrone/Sites/meal/../meal/src/views.py" in new_photo 
    532.  print form.reservation 

Exception Type: AttributeError at /photo/new/ 
Exception Value: 'PhotoForm' object has no attribute 'reservation' 
+0

你能發佈回溯嗎?順便說一句:你不需要設置PhotoForm __init__,因爲如果PhotoForm不設置任何構造函數,那麼基類構造函數將被稱爲 – errx 2011-01-24 00:18:01

+0

肯定的事情..謝謝 – Emile 2011-01-24 00:22:09

回答

4

關鍵是在窗體中有files = request.FILES。

@login_required 
def new_photo(request, template_name="photo/newphoto.html"): 

    form = PhotoForm(user= request.user, data=request.POST, files=request.FILES) 

    if request.method == 'POST': 
    form.photographer = request.user 
    if form.is_valid(): 
     photo = form.save(commit=False) 
     photo.photographer = request.user 
     photo.save() 
     return HttpResponseRedirect('/photo/%d/' % photo.id) 
0

您的入站表單處理看起來有點奇怪,但我通常不使用ModelForm。下面是我的通常是這樣的:

def some_form_view(request): 
    if request.method != 'POST': 
    raise Http404 # or whatever 
    form_data = FormClass(request.POST, request.FILES) 
    if not form_data.is_valid(): 
    context['form'] = form_data 
    return render_to_response(...) # invalid for m 

    new_object = ModelObject(
     field=form_data.cleaned_data['field'], 
     other_field=form_data.cleaned_data['other_field']) 
    new_object.save() 

    context['new_object'] = new_object 
    return render_to_response(...) # success 

所以要注意的事情:

  • 我不認爲「form.reservation」是一個有效的標識符。您應該只說「打印表單」或「打印str(表單)」,而不要嘗試打印單個字段。

  • 在處理這些數據之前,您幾乎可以肯定地調用is_valid()。如果表單本身無效,這應該會引發表單驗證錯誤。

  • 只有通過form.cleaned_data ['foo']直接訪問表單數據,並且永遠不會通過.data訪問表單數據,因爲您訪問的內容可能來自用戶。

希望這會有所幫助。