2013-03-10 2 views
0

У меня есть разные модели:форм из моделей

Cars 
Pictures (models.ForeignKey(Cars)) 
CarsOptions(models.OneToOneField(Cars)) 

Тогда я хочу, что пользователь может добавлять новые автомобили. Forms.py:

class NewCarsForm(ModelForm): 
    class Meta: 
     model = Cars 
     exclude = ('checked','user') 

В views.py:

@login_required 
def add_car(request): 
    form = NewCarsForm(request.POST or None) 
    if form.is_valid(): 
     cmodel = form.save() 
     cmodel.save() 
     return redirect(profile) 
    return render(request, 'add_car.html', { 'form': form,}) 

У меня есть несколько вопросов (да, я читал this).

  1. Как вы можете видеть, пользователь может добавить только «автомобиль», а не фотографии и варианты. Как это сделать на одной странице в одной форме?
  2. exclude = ('checked','user'), это означает, что я хочу сделать все новые позиции с checked = 0, поэтому я могу их фильтровать. И пользовательское поле - пользователи не могут выбрать пользователя в списке. Как взять идентификатор пользователя (который добавляет автомобиль) в form.save()?

Спасибо.

Update:

class Pictures(models.Model): 
    cars = models.ForeignKey(Cars, related_name='pictures') 
    width = models.PositiveIntegerField(editable=False, default=640) 
    height = models.PositiveIntegerField(editable=False, default=480) 
    image = models.ImageField(upload_to=lambda inst, fname: 'users_img/' + 'cars' + fname, height_field='height', width_field='width', max_length=100) 
    def __unicode__(self): 
     return str(self.id) 
+0

1. Это 3 различные формы модели. Если 3 имеют постоянные взаимно-однозначные отношения друг к другу, почему бы не объединить их в 1 модель? – sergzach

+0

нет 3, одна модель с 1 2 1 – tim

+0

Непонятно, вы имеете в виду одну форму Django, которую хотите, или вы имеете в виду одну форму html? – sergzach

ответ

2

forms.py

class NewCarsForm(ModelForm): 
    class Meta: 
     model = Cars 
     exclude = ('checked','user') 

PicturesFormset = inlineformset_factory(Cars, Pictures, 
    fields=('field_name', 'field_name'), can_delete=True) 

CarsOptionsFormset = inlineformset_factory(Cars, CarsOptions, 
    fields=('field_name', 'field_name'), can_delete=True) 

views.py

@login_required 
def add_car(request): 
    cars = Cars(user=request.user) 
    if request.method == 'POST': 
     form = NewCarsForm(request.POST, instance=cars) 
     if form.is_valid(): 
      cmodel = form.save() 

      picture_formset = PicturesFormset(request.POST, request.FILES, 
       instance=cmodel) 
      if picture_formset.is_valid(): 
       picture_formset.save() 

      option_formset = CarsOptionsFormset(request.POST, instance=cmodel) 
      if option_formset.is_valid(): 
       option_formset.save() 

      return redirect(profile) 

    form = NewCarsForm() 
    picture_formset = PicturesFormset(instance=Cars()) 
    option_formset = CarsOptionsFormset(instance=Cars()) 

    return render(request, 'add_car.html', { 
     'form': form, 
     'picture_formset': picture_formset, 
     'option_formset': option_formset, 
    }) 

шаблон

<form method="POST" enctype="multipart/form-data"> 
    {% csrf_token %} 

    <h4>Car:</h4> 
    {{ form.as_p }} 

    <h4>Picture:</h4> 
    {{ picture_formset.as_p }} 

    <h4>Options:</h4> 
    {{ option_formset.as_p }} 

    <input type="submit" value="Submit"> 
</form> 
+0

'IntegrityError: (1062," Duplicate entry '1' для key 'user_id' ")' – tim

+0

remove option_formset ... Попробуйте сохранить только Cars и Picture, мы увидим, снова отобразится ли эта ошибка. Протестируйте его один за другим, чтобы вы знали корень проблемы. Таким образом, легко отлаживать и исправлять проблему. – catherine

+0

Убираю один за другим, поэтому у меня есть только Автомобили, но ошибка такая же. – tim

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