2016-03-14 1 views
0

Хорошо, поэтому, используя регистрацию обработки Django и All-Auth (без социальной регистрации), я бы хотел сделать, когда я беру имя пользователя, я хотел бы сравнить его со строками второй таблицы.Django All-Auth - проверка соответствия связанного объекта при создании учетной записи?

Чтобы вырезать Короче говоря, user выступает в качестве идентификатора для (реального мира) игрока, игроки могут иметь много character с, и я хочу, чтобы проверить, чтобы убедиться, что character имени не принимается, что соответствует имени пользователя и оба регистрируют пользователя и создают для них символ, соответствующий их имени пользователя, если все в порядке.

Чтобы было ясно:

Если персонаж с именем пользователь пытается зарегистрировать не существует, пусть регистр пользователя и создать этот символ, тоже.

Если символ с именем, которое пользователь пытается зарегистрировать, существуют, верните ошибку в действие «имя уже взято».

Это не работает как простое индивидуальное расширение профиля пользователя, поскольку для каждого пользователя может быть много символов, а не только один. Нет необходимости в дополнительных полях формы, потому что необходимые данные должны быть уже введены как часть имени пользователя.

Я, кажется, не понимаю проверки, как это происходит во всех auth, таким образом, чтобы это стало возможным, и я прочитал как часть источника, так и страницу readthedocs.

Я рад расширить или ответить на вопросы по этому вопросу. (Я считаю, что моя версия питона 2.x на моем сервере.)


Дополнительный вопрос, который я бы рассмотреть бонус ответил:

Я также хочу, чтобы зарезервировать номер символа имена по какой-либо причине в качестве защищенных персонажей, таким образом, люди не могут регистрировать учетные записи, чтобы соответствовать (и в основном лишить людей заслуг в целевом сообществе). Как я могу указать, что имя не может использоваться, потому что оно является защищенным именем и предоставляет дополнительные данные о регистрации с ним?

ответ

2

Я не делал ничего похожего на то, что вы хотите сделать, поэтому я не могу дать вам точный код, но я считаю, что решение состоит в том, чтобы вы определили свой собственный DefaultAccountAdapter и попробуйте перезаписать либо методы new_user, либо save_user.

Чтобы написать свой собственный адаптер, вам необходимо установить следующие настройки

ACCOUNT_ADAPTER = 'path.to.adapters.YourAccountAdapter' 

, а затем определить

from allauth.account.adapter import DefaultAccountAdapter 

class YourAccountAdapter(DefaultAccountAdapter): 

    def clean_username(self, username, shallow=False): 
     # ----------------------- 
     # do our validation first 
     # ----------------------- 

     # character exists with username? 
     if (YourModel.objects.filter(loginname__iexact=str(username))): 

      # let's poke this a bit 
      char = YourModel.objects.get(loginname__iexact=str(username)) 

      # is it a protected character name? 
      if char.protected: 
       raise ValidationError("Name belongs to protected character, please contact site admin to claim") 
      else: 
       raise ValidationError("Character with name exists, cannot use as a login name") 

     # ----------------------------------------- 
     # if that went okay, call and return parent 
     # ----------------------------------------- 
     return super(YourAccountAdapter, self).clean_username(username, shallow) 

См http://django-allauth.readthedocs.org/en/latest/advanced.html

Другой альтернативный (или что-то делать, а) заключается в использовании вашей собственной формы регистрации, где вы сможете предварительно проверить имя пользователя, прежде чем принимать форму. Чтобы сделать это, вам нужно добавить следующие настройки на вашем

ACCOUNT_FORMS = { 'signup': 'path.to.forms.AllauthSignupForm'} 

, а затем использовать

from allauth.account.forms import SignupForm 
from django.core.validators import ValidationError 

class AllauthSignupForm(SignupForm): 

    def clean_username(self): 
     # check for duplicates here and then 
     if duplicate: 
      raise ValidationError("Username is not allowed") 

    return org 
+0

Да, я видел, что документация.Тем не менее, не ясно, как преднамеренно отказывать в валидации, а это недостающая часть головоломки, чтобы такая работа работала, даже если она была немного в форме foppish. –

+1

Просто отредактировал мой ответ, чтобы предложить вам переписать регистрационную форму, где вы можете проверить наличие дубликатов даже до создания записи. Но чтобы ответить на ваш комментарий, вы должны попытаться поднять ValidationError или что-то подобное из адаптера и посмотреть, что происходит. – dkarchmer

+0

Это кажется более практичным. [...] Действительно, валидация должна произойти в модели, но из-за желания взаимодействовать с двумя моделями должен быть какой-то посредник, разговаривающий с обоими. Если бы это было взаимно однозначно, это было бы тривиальной, хорошо понятой проблемой. [...] Когда я снова работаю над этим проектом, я попробую то, что вы предлагаете. Если это сработает, я прокомментирую любые дополнительные примечания, а затем приму ответ, чтобы вы получили кредит. (В любом случае, я все еще открыт для того, чтобы слышать другие идеи.) –

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