2015-04-16 4 views
0

В models.py:Формы в Django. Как инициализировать поле модели из формы?

class Client(AbstractBaseUser): 

    username = models.CharField(max_length=32, unique=True) 
    email = models.EmailField('email address', unique=True, db_index=True) 
    avatar = models.ImageField('avatar', upload_to='avatars') 
    id = id(object) 

class Order(models.Model): 
    class Meta(): 
     db_table = 'order' 

    short_desc = models.CharField(max_length=30) 
    subject = models.ForeignKey(Subject, blank=True) 
    user_id = models.ForeignKey('Client', to_field='id', related_name='client_id', default='0', blank=True) 
    performer_id = models.ForeignKey('Client', to_field='id', related_name='performer_id', default='0', blank=True) 
    worktype = models.ForeignKey(Type, blank=True) 
    level = models.IntegerField(default=0, blank=True) 
    readiness = models.BooleanField(default=False, blank=True) 
    description = models.TextField(max_length=2000, blank=True) 
    file = models.FileField(upload_to='orderfiles', blank=True) 
    #maxdate = models.DateField(blank=True) 
    addate = models.DateField(auto_now=True, blank=True) 
    price = models.IntegerField(max_length=10, blank=True) 
    responses = models.IntegerField(blank=True) 

В forms.py:

class AddOrderForm(forms.ModelForm): 

    short_desc  = forms.CharField(widget=forms.TextInput,label="Краткое описание(послужит именем)") 
    subject   = forms.ModelChoiceField(queryset=Subject.objects.all(), label="Предмет") 
    worktype   = forms.ModelChoiceField(queryset=Type.objects.all(), label="Тип") 
    level   = forms.IntegerField(widget=forms.TextInput,label="Уровень сложности (от 1 до 5)") 
    description  = forms.CharField(widget=forms.TextInput,label="Полное описание") 
    #maxdate   = forms.DateField(widget=forms.TextInput,label="maxdate") 
    price   = forms.IntegerField(widget=forms.TextInput,label="Ваша цена") 
    responses  = forms.IntegerField(widget=forms.TextInput,label="Кол-во ответов на заказ") 

    class Meta: 
     model = Order 
     fields = ['short_desc', 'level', 'description', 'price', 'responses', 'subject', 'worktype'] 

В views.py:

def addorder(request, user_id): 
    """ 
    Adding Order view 
    """ 
    if request.POST: 
     form = AddOrderForm(request.POST) 

     if form.is_valid(): 

      form.save() 

      return redirect('/') 


    else: 
     return redirect('/') 
    auth1 = auth.get_user(request).username 
    return render_to_response('customer.html', { 'form': form,'username' : auth1}, context_instance=RequestContext(request)) 

мне нужно поле user_id в class Order быть инициализирована сразу после add ing order(). Где я должен это делать и каким образом? Мне нужно что-то вроде этой логики: Client добавляет Order через AddOrderForm и затем user_id поле добавленного объекта class Order должен быть инициализирован с объектом class Client, чей идентификатор равен user_id в параметрах addorder() функции.

+0

Есть ли порядочная причина, по которой вы используете виджет textInput для integerField? Вы можете использовать подробное имя и не переопределять все поля в форме. – abrunet

ответ

2

Вы можете сделать это, используя commit=False при сохранении формы. Это типичный способ сохранения объекта с использованием модельной формы с меньшим количеством полей.

def addorder(request, user_id): 
    """ 
    Adding Order view 
    """ 
    if request.POST: 
     form = AddOrderForm(request.POST) 

     if form.is_valid(): 

      order = form.save(commit=false) 
      order.client_id = Client.objects.get(id=user_id) 
      order.save() 

      return redirect('/') 


    else: 
     return redirect('/') 
    auth1 = auth.get_user(request).username 
    return render_to_response('customer.html', 
      { 'form': form,'username' : auth1}, 
      context_instance=RequestContext(request)) 

Отказ от ответственности: Обработать ошибки, например. Client.objects.get() может потерпеть неудачу. Используйте соответствующие поля для поиска.

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