2012-02-17 17 views
6

Estoy escribiendo una aplicación que almacena "Trabajos". Se definen como tener una ForeignKey vinculada a un "Usuario". No entiendo cómo pasar ForeignKey en el modelo al crearlo. Mi modelo para trabajo funcionó bien sin una clave externa, pero ahora que estoy tratando de agregar usuarios al sistema no puedo obtener el formulario para validar.En Django, ¿cómo se transfiere ForeignKey a una instancia de un modelo?

models.py:

from django.db import models 
from django import forms 
from django.contrib.auth.models import User 

class Job(models.Model): 
    user = models.ForeignKey(User) 
    name = models.CharField(max_length=50, blank=True) 
    pub_date = models.DateTimeField('date published', auto_now_add=True) 
    orig_image = models.ImageField('uploaded image', upload_to='origImageDB/', blank=True) 
    clean_image = models.ImageField('clean image', upload_to='cleanImageDB/', blank=True) 
    fullsize_image = models.ImageField('fullsize image', upload_to='fullsizeImageDB/') 
    fullsize_clean_image = models.ImageField('fullsize clean image', upload_to='fullsizeCleanImageDB/') 
    regions = models.TextField(blank=True) 
    orig_regions = models.TextField(blank=True) 

class JobForm(forms.ModelForm): 
    class Meta: 
     model = Job 

En views.py estaba creando los objetos de la siguiente manera:

if request.method == 'POST': 
    form = JobForm(request.POST, request.FILES) 
    if form.is_valid(): 
     #Do something here 

entiendo que esto pasa los datos del formulario y los archivos cargados en el formulario. Sin embargo, no entiendo cómo pasar un Usuario para establecerse como ForeignKey.

Gracias de antemano a cualquiera que pueda ayudar.

Respuesta

1

Probar:

if request.method == 'POST': 
    data = request.POST 
    data['user'] = request.user 
    form = JobForm(data, request.FILES) 
    if form.is_valid(): 
     #Do something here 
+0

Esto funciona bien, excepto que 'request.user' debe ser 'request.user.id'. Gracias. – user1216674

+0

@ user1216674 En realidad, en Django 1.6.1 request.user funciona bien – AndrewSmiley

+1

request.POST es inmutable – mossplix

7

Un patrón típico de Django es:

  1. excluir el sector user del modelo de formulario
  2. guardar el formulario con commit=False
  3. establecer job.user
  4. guardar en la base de datos

En su caso:

class JobForm(forms.ModelForm): 
    class Meta: 
     model = Job 
     exclude = ('user',) 

if request.method == 'POST': 
    form = JobForm(request.POST, request.FILES) 
    job = form.save(commit=False) 
    job.user = request.user 
    job.save() 
    # the next line isn't necessary here, because we don't have any m2m fields 
    form.save_m2m() 

Consulte la documentación de Django en el model form save() method para más información.

+0

No se dio cuenta de que la función save() de ModelForm devolvió una instancia de la clase de modelo especificada en el atributo de modelo Meta class del formulario. ¡Gracias por esto! – AndrewSmiley

Cuestiones relacionadas