2017-01-18 130 views
0

我有一個Profile模型,它具有用戶模型的外鍵。我創建了一個'編輯個人資料'視圖,允許用戶更新個人資料信息。其中一個領域是一個圖像領域(託管與cloudinary)。由於將此字段更改爲Cloudinary字段,我似乎在配置文件沒有上載圖像時,新創建的配置文件對象出現問題。但是,如果用戶有一個配置文件圖像我可以加載'edit_profile'視圖沒有問題。「NoneType」類型的對象沒有len() - 編輯表格

我縮小了它的形象領域,因爲當我刪除領域,它的作品沒有問題。儘管回溯不是很有幫助。

這是我的edit_profile視圖。

@login_required 
def edit_profile(request): 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, request.FILES, instance=request.user) 
     profile_form = ProfileForm(request.POST,request.FILES, instance=request.user.profile) 
     if user_form.is_valid() and profile_form.is_valid(): 
      user_form.save() 
      profile_form.save() 
      messages.success(request, "Successfully Updated") 
      return redirect('profile:edit_profile') 
     else: 
      messages.success(request, "Please correct the below info") 
    else: 
     user_form = UserForm(instance=request.user) 
     profile_form = ProfileForm(instance=request.user.profile) 
    return render(request, 'profile/edit.html', { 
     'user_form': user_form, 
     'profile_form': profile_form 
}) 

我有兩種形式,一種是允許用戶更新名字,姓氏和電子郵件的用戶模型。然後是配置文件表單,它允許更新其他字段。

我想我需要添加一些邏輯來檢查圖像字段是否設置爲空!?我沒有在場上設置null = True設置,所以我有點困惑。

這是我的個人資料型號:

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 

    image = CloudinaryField('image', default="thumbnail_mqe6ne") 

    height = models.DecimalField(help_text="CM", max_digits=8, decimal_places=2, validators=[ 
     MinValueValidator(20), 
     MaxValueValidator(600), 
     ]) 

    gender_option = (
     ('Male', 'Male'), 
     ('Female', 'Female'), 
    ) 

    profile_status = (
     ('Public', 'Public'), 
     ('Private', 'Private'), 
    ) 

    birth_date = models.DateField(blank=True, default=datetime.date.today, verbose_name="Date of Birth") 


    gender = models.CharField(choices=gender_option, blank=True, max_length=10) 
    bio = models.TextField(max_length=300, blank=True) 
    location = models.CharField(max_length=30, blank=True) 


    status = models.CharField(default="Public", max_length=10, choices=profile_status) 

    def __unicode__(self): 
     return unicode(self.user.username) 

    def get_absolute_url(self): 
     return reverse("profile:profile_home", kwargs={"id": self.id}) 

//回溯

Environment: 


Request Method: GET 
Request URL: http://localhost:8000/profile/edit/ 

Django Version: 1.10.4 
Python Version: 2.7.6 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.sites', 
'stats', 
'home', 
'sorl.thumbnail', 
'storages', 
'cloudinary', 
'debug_toolbar', 
'django_cleanup', 
'allauth', 
'allauth.account', 
'allauth.socialaccount', 
'allauth.socialaccount.providers.facebook'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
'whitenoise.middleware.WhiteNoiseMiddleware', 
'debug_toolbar.middleware.DebugToolbarMiddleware'] 


Template error: 
In template /vagrant/bodymakeover/templates/profile/edit.html, error at line 27 
    object of type 'NoneType' has no len() 17 : {% comment %}{{ profile.first_name }}<br> 
    18 : {{ profile.last_name }}<br> 
    19 : {{ profile.bio }}<br> 
    20 : {{ profile.location }}<br> 
    21 : {{ profile.birthdate }}<br>{% endcomment %} 
    22 : 
    23 : 
    24 : <form method="post" enctype='multipart/form-data'> 
    25 : {% csrf_token %} 
    26 : {{ user_form.as_p }} 
    27 : {{ profile_form.as_p }} 
    28 : <button class="btn btn-primary" type="submit">Save changes</button> 
    29 : </form> 
    30 : 
    31 : 
    32 : </div> 
    33 : 
    34 : 
    35 : {% endblock %} 

Traceback: 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner 
    39.    response = get_response(request) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 
    23.     return view_func(request, *args, **kwargs) 

File "/vagrant/bodymakeover/home/views.py" in edit_profile 
    54.   'profile_form': profile_form 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/shortcuts.py" in render 
    30.  content = loader.render_to_string(template_name, context, request, using=using) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/loader.py" in render_to_string 
    68.  return template.render(context, request) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/backends/django.py" in render 
    66.    return self.template.render(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render 
    208.      return self._render(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render 
    94.  return self.nodelist.render(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render 
    994.     bit = node.render_annotated(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render_annotated 
    961.    return self.render(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render 
    174.   return compiled_parent._render(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render 
    94.  return self.nodelist.render(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render 
    994.     bit = node.render_annotated(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render_annotated 
    961.    return self.render(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render 
    70.     result = block.nodelist.render(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render 
    994.     bit = node.render_annotated(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render_annotated 
    961.    return self.render(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render 
    70.     result = block.nodelist.render(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render 
    994.     bit = node.render_annotated(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render_annotated 
    961.    return self.render(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render 
    1044.    output = self.filter_expression.resolve(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in resolve 
    711.     obj = self.var.resolve(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in resolve 
    852.    value = self._resolve_lookup(context) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in _resolve_lookup 
    915.        current = current() 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/forms/forms.py" in as_p 
    289.    errors_on_separate_row=True) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/forms/forms.py" in _html_output 
    226.      'field': six.text_type(bf), 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/utils/html.py" in <lambda> 
    382.   klass.__unicode__ = lambda self: mark_safe(klass_unicode(self)) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/forms/boundfield.py" in __str__ 
    43.   return self.as_widget() 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/forms/boundfield.py" in as_widget 
    89.   attrs = self.build_widget_attrs(attrs, widget) 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/forms/boundfield.py" in build_widget_attrs 
    238.   if widget.use_required_attribute(self.initial) and self.field.required and self.form.use_required_attribute: 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/forms/widgets.py" in use_required_attribute 
    441.   return super(ClearableFileInput, self).use_required_attribute(initial) and not initial 

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/cloudinary/__init__.py" in __len__ 
    129.   return len(self.public_id) 

Exception Type: TypeError at /profile/edit/ 
Exception Value: object of type 'NoneType' has no len() 

任何幫助,因爲我敲我的頭靠在牆上大加讚賞。有希望的東西是明顯的:)

+0

你能給出更詳細的追溯? – Rohanil

+0

嘿Rohanil,我添加了追蹤的最後部分,它似乎絆倒。夠了嗎?謝謝回覆。 – JDavies

+0

不,這還不夠。爲什麼你不能粘貼整個事情? –

回答

0

該錯誤發生是因爲Python正在使用len()測試真相,其定義爲len(self.public_id)。當public_idNone時,會引發錯誤。

我們的SDK團隊即將推出更全面的解決方案,該解決方案將支持CloudinaryField中的None值。

作爲臨時解決方法,您可以在 our GH(例如this one)上檢查社區建議的解決方案。

此外,您可以訂閱問題 - here以在發佈修復程序後收到通知。

相關問題