SORU
9 NİSAN 2010, Cuma


Django'In auth_user.username varchar(75)? Bu nasıl yapılabilir?

Orada hiç bir sorun auth_user tablo bir e-posta sığacak şekilde kullanıcı adı ikilik(75) yapmak için alter. Böyle bir şey olursa sonu ne yapar?

Auth_user değiştirmek olsaydı.username varchar(75) değiştirmek gerekir django? Kaynak kod içinde 30 75 değişen bir konu sadece bu

username = models.CharField(_('username'), max_length=30, unique=True, help_text=_("Required. 30 characters or fewer. Letters, numbers and @/./ /-/_ characters"))

Yoksa değişmiş olması gerekir ki bu alanda başka bir doğrulama ya da bunu yapmak için başka yansımaları olur?

Yorum bartek ile tartışma aşağıda bunu nedeni ile ilgili olarak bkz.

EditGeri aylar sonra arayan oldu bu. Bazı uygulamalar veya bir kullanıcı adı kullanmak şartı arzusu, kayıt ve kimlik doğrulama için yalnızca e-posta kullanıyorlar. öncül bilmeyen herkes için: Django auth ne yazık ki.contrib, kullanıcı adı gereklidir. Kullanıcı adı alanına e-posta koyarak başlayabilirsin, ama sahada sadece 30 char ve e-postalar gerçek dünyada uzun olabilir. Potansiyel olarak 75 char burada önerilen daha uzun, ama 75 char barındırmaktadır en aklı başında e-posta adresleri. Soru-auth-tabanlı e-posta uygulamaları ile karşılaşılan bu durumu hedefleyen.

CEVAP
10 NİSAN 2010, CUMARTESİ


Çekirdek modeli dokunmadan bunu başarmak için bir yol var, ve miras olmadan, ama kesinlikle hackish ve ekstra bakım ile kullanırdım.

Eğer Django doktor bakarsanız on signals, bir gerçek bir model sınıf metaclass tarafından oluşturulduktan sonra temel olarak gönderilen class_prepared " adını göreceksiniz. Bu anı daha önce herhangi bir model değiştirmek için son şanssihirli(ıe: , *, syncdb, *ModelAdmin5 vb.) alır.

Yani plan basit, sadece kayıt sinyali işleyicisi olacak algılamak zaman için denir User model ve değiştir max_length özelliği username alan.

Esas soru, bu hayat bir kod gerekir? User model yüklenmeden önce idam olmalı, sık sık anlamına gelirçok erken. Ne yazık ki, gidemezsin (django1.1.1signals ithal şeylerin sonu yoktur , çünkü kontrol yok başka bir sürüm) settings koy.

Daha iyi bir seçim kukla uygulama modelleri bir modül koymak olacaktır, ve bu uygulamaINSTALLED_APPS listenin başında/demether şeyden önce ithal alır). Burada myhackishfix_app/models.py olabilir ne bir örnek :

from django.db.models.signals import class_prepared

def longer_username(sender, *args, **kwargs):
    # You can't just do `if sender == django.contrib.auth.models.User`
    # because you would have to import the model
    # You have to test using __name__ and __module__
    if sender.__name__ == "User" and sender.__module__ == "django.contrib.auth.models":
        sender._meta.get_field("username").max_length = 75

class_prepared.connect(longer_username)

Bu hile yapacak.

Birkaç nota rağmen

  • Ayrıca alan help_text yeni maksimum uzunluk yansıtacak şekilde değiştirmek isteyebilirsiniz
  • İsterseniz otomatik admin almak için alt UserChangeForm, UserCreationForm AuthenticationForm maksimum uzunluğu değil sonucuna örnek alan, ama doğrudan form alanı bildirimi.

Eğer South kullanıyorsanız temel veritabanında sütun değiştirmek için aşağıdaki göç oluşturabilirsiniz:

import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models

class Migration(SchemaMigration):

    def forwards(self, orm):

        # Changing field 'User.username'
        db.alter_column('auth_user', 'username', models.CharField(max_length=75))


    def backwards(self, orm):

        # Changing field 'User.username'
        db.alter_column('auth_user', 'username', models.CharField(max_length=35))


    models = { 

# ... Copy the remainder of the file from the previous migration, being sure 
# to change the value for auth.user / usename / maxlength

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Justin Davis

    Justin Davis

    14 Ocak 2008
  • MultiPlayStationMan

    MultiPlaySta

    17 Aralık 2009
  • YouChewBu

    YouChewBu

    26 Ocak 2009