2016-06-16 71 views
0

我試圖在註冊後創建一個創建配置文件表單並且我的代碼位於below.Its已經只適用於輕微問題,即如果模型的name字段匹配數據庫中的一個,Django帶來了一個錯誤信息column slug is not unique。我看到slug字段與另一個衝突,我如何編輯下面的代碼來提出一個驗證錯誤消息,如果提交的名稱類似於db中的一個?驗證創建配置文件表單中的字段

models.py

from __future__ import unicode_literals 
from django.db import models 
from django.contrib.auth.models import User 

class Profile(models.Model): 
    name= models.CharField(max_length=10) 
    description=models.TextField() 
    slug=models.SlugField(unique=True) 
    user = models.OneToOneField(User, blank=True, null=True) 
    def __str__(self): 
     return self.name 

views.py

def create_profile(request): 
    form_class = ProfileForm 

    if request.method == 'POST': 

     form = form_class(request.POST) 
     if form.is_valid(): 

      profile = form.save(commit=False) 

      profile.user = request.user 
      profile.slug = slugify(profile.name) 

      profile.save() 

      slug = slugify(profile.name) 
      return redirect('profile_details', slug=profile.slug) 

    else: 
     form = form_class() 
     return render(request, 'profile/create_profile.html', {'form': form,}) 

urls.py

urlpatterns=[url(r'^accounts/create_profile/$',views.create_profile,name='registration_create_profile'),] 

感謝

回答

0

ModelForm 5事實上validate uniqueness與參數t的is_valid()檢查。

您的情況的問題是,您運行is_valid()後手動設置slug。因此,您必須在設置slu manually後手動驗證唯一性。像這樣的東西會工作:

if form.is_valid(): 
    profile = form.save(commit=False) 

    profile.user = request.user 
    profile.slug = slug = slugify(profile.name) 

    # Check slug uniqueness, keep appending a digit until it fits 
    n = 1 
    while Profile.objects.filter(slug=profile.slug).exists(): 
     # Need to find a new slug. 
     profile.slug = '%s-%d' % (slug, n) 
     n += 1 

    profile.save() 

    return redirect('profile_details', slug=profile.slug) 

注意,這可能是更好的模型的save()方法內,而不是在視圖中執行此唯一性檢查 - 這恰恰說明了邏輯。

或者,您可以使用像django-autoslug這樣的庫爲您執行此邏輯。

+0

感謝您的洞察力,它的工作完美。但是如果我想確保名稱是唯一的,那麼它會引發一個驗證錯誤消息'Name already exists'。由於文檔說is_valid()確保字段標籤的unique = true字段,所以我試着把一個已經存在的使用的名稱雖然使它在模型中是唯一的,但它會顯示'... View returns none' – Bolaji

+0

如果您希望名稱是唯一的,那麼您應該在模型字段定義中指定'unique = True'。 – solarissmoke