2011-04-08 14 views
5

tengo este modelo:Django Haga ContentType No se requiere

class Auth(models.Model): 
    TYPES = (
     ('agent', 'Agent'), 
     ('broker', 'Broker'), 
    ) 
    user = models.ForeignKey(User, unique=True) 
    type = models.CharField(max_length=20, choices=TYPES) 
    applied = models.BooleanField() 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField(db_index=True) 
    content_object=generic.GenericForeignKey('content_type', 'object_id') 

y cada vez que hago algo como esto:

User.objects.create_user(username="myuser", password="myuser", email="myemail.com") 
u = User.objects.get(username="myuser") 
profile = Auth(user=u) 
profile.save() 

por supuesto que voy a recibir el error:

IntegrityError: (1048, "Column 'content_type_id' cannot be null") 

Para mis propósitos, no puedo evitar los tipos de contenido porque Auth es una clase de la que heredan las clases Broker y Agent, lo que me permite hacer múltiples perfiles personalizados

Me preguntaba si hay una forma en que el tipo de contenido no sea necesario.

¡Gracias de antemano!

Respuesta

4
content_type = models.ForeignKey(ContentType, null=True, blank=True) 

null=True hace que sea opcional en el modelo de datos, blank=True hace que sea opcional cuando se utiliza la forma de administración (de lo contrario obtendrá error de validación).

+0

no funciona – yretuta

+1

¿ha regenerado la estructura de la base de datos? – vartec

+1

oops. jaja. Olvidé eso. Estoy eligiendo esta respuesta porque es más completa. Gracias – yretuta

1

O simplemente le da al campo un valor default=..., o lo configura en null=True.

1
+0

intentado fijar content_type y object_id en nulo, no funcionó. Al establecerlo en content_object se generaría un error – yretuta

0

OK, encontered el mismo problema hoy con Django 1.8

models.py:

class Author(models.Model): 
    user = models.OneToOneField(User) 
    name = models.CharField(max_length=50) 
    sig = models.CharField(max_length=150) 
    up_num = models.IntegerField(default=0) 

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

views.py:

def register(request): 
    if request.method == 'POST': 
     form = registerFrom(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      email = form.cleaned_data['email'] 
      password = form.cleaned_data['password'] 
      name = form.cleaned_data['name'] 
      sig = form.cleaned_data['sig'] 
      u = User.objects.create_user(username, email, password) 

      add_blog_permission = Permission.objects.create(codename='add_blog') 
      change_blog_permission = Permission.objects.create(codename='change_blog') 
      delete_blog_permission = Permission.objects.create(codename='delete_blog') 
      add_comment_permission = Permission.objects.create(codename='add_comment') 
      add_message_permission = Permission.objects.create(codename='add_message') 
      delete_message_permission = Permission.objects.create(codename='delete_message') 
      u.user_permissions.add(add_blog_permission, change_blog_permission, delete_blog_permission, add_comment_permission, add_message_permission, delete_message_permission) 


      Author.objects.create(user=u, name=name, sig=sig) 
      return HttpResponseRedirect(reverse('login', args=())) 
    form = registerFrom() 
    return render(request, 'register.html', {'form': form}) 

en la página de registro del servidor después de la carrera, cuando se presenten los datos:

IntegrityError: (1048, "Column 'content_type_id' cannot be null") 

Finalmente, encontré que hay errores en mi código:

add_blog_permission = Permission.objects.create(codename='add_blog') 

debería ser:

add_blog_permission = Permission.objects.get(codename='add_blog') 
Cuestiones relacionadas