2016-06-16 3 views
0

Я пытаюсь создать форму профиля профиля после регистрации, а мои коды ниже. Он уже работает только для небольшой проблемы, то есть если поле name модели Profile соответствует одному в базе данных , django выводит сообщение об ошибке column slug is not unique. Я вижу, что поле пули сталкивается с другим, как я буду редактировать приведенные ниже коды, чтобы поднять сообщение об ошибке проверки, если представленное имя аналогично одному в 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 ы фактически validate uniqueness как в пар t проверок is_valid().

Проблема в вашем случае заключается в том, что вы вручную устанавливаете slug после запуска is_valid(). Из-за этого вам придется вручную проверять уникальность после установки пули. Что-то, как это будет работать:

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

Спасибо за понимание, он работал идеально. Но что, если я хочу убедиться, что имена уникальны, поэтому возникает сообщение об ошибке проверки, в котором «Имя уже существует». Поскольку документ говорит, что is_valid() обеспечивает метку поля с полем unique = true, я попытался поместить уже используемое имя, делая его уникальным в модели, но оно вызывает «... View возвращает none» – Bolaji

+0

Если вы хотите, чтобы имена были уникальными, вы должны указать 'unique = True' в определении поля модели. – solarissmoke

Смежные вопросы