2010-09-06 6 views
7

Я хочу установить BooleanField inuse в True, когда я сохраняю ModelForm (я использую форму вне области администрирования), и я не уверен, как это сделать.Simple Django form/model save question

Модели:

class Location(models.Model): 
    place = models.CharField(max_length=100) 
    inuse = models.BooleanField() 

class Booking(models.Model): 
    name = models.CharField(max_length=100, verbose_name="Your name*:") 
    place = models.ManyToManyField(Location, blank=True, null=True) 

формы:

class BookingForm(ModelForm): 

    class Meta: 
     model = Booking 

     def save(self, commit=True): 
      booking = super(BookingForm, self).save(commit=False) 
      if commit: 
       booking.save() 
       self.save_m2m() 
       for location in booking.place.all(): 
        location.inuse = True 
        print location #nothing prints 
        location.save() 

Вид:

def booking(request): 
    form = BookingForm() 
    if request.method == 'POST': 
     form = BookingForm(request.POST) 
     if form.is_valid(): 
      form.save() 
     else: 
      form = form 

     return render_to_response('bookingform.html', { 
       'form': form, 
      }) 

Обновлено до последней (см Manoj Govindan's answer). Он по-прежнему не обновляет inuse True при отправке/сохранении.

+0

Существуют ли какие-либо другие модели, участвующие? Какова базовая модель для формы «Бронирование»? Какова связь между «Расположение» и другими моделями, если таковые имеются? –

+0

никаких отношений, кроме того, что вы видите минус какая-то мета и т. Д. –

+0

Что не так с 'models.BooleanField (default = True)'? –

ответ

3
class BookingForm(ModelForm): 

    class Meta: 
     model = Booking 

    def save(self, commit=True): 
     booking = super(BookingForm, self).save(commit=False) 
     booking.inuse = True 
     if commit: 
      booking.save() 
+1

@ Даниэль: не должно быть «Location.inuse»? Согласно OP 'Booking' является _form_. –

+0

Взгляд перспективный, но дает мне ... TypeError at/ super (type, obj): obj должен быть экземпляром или подтипом типа –

+1

@Rob B: попробуйте заменить 'booking = super (Booking, self) .save (commit = False) 'с' booking = super (BookingForm, self) .save (commit = False) ' –

2

Вот мой удар в нем:

class BookingForm(ModelForm): 
    class Meta: 
     model = Booking 

    def save(self, commit=True): 
     booking = super(BookingForm, self).save(commit=False) 
     if commit: 
      booking.save() 
      self.save_m2m() 
      for location in booking.place.all(): 
       location.inuse = True 
       location.save() 

Update

Весь код, который я использовал:

# models.py 
class Location(models.Model): 
    place = models.CharField(max_length=100) 
    inuse = models.BooleanField() 

class Booking(models.Model): 
    name = models.CharField(max_length=100, verbose_name="Your name*:") 
    place = models.ManyToManyField(Location, blank=True, null=True) 

# forms.py 
class BookingForm(ModelForm): 
    class Meta: 
     model = Booking 

    def save(self, commit=True): 
     booking = super(BookingForm, self).save(commit=False) 
     if commit: 
      booking.save() 
      self.save_m2m() 
      for location in booking.place.all(): 
       location.inuse = True 
       location.save() 

In [1]: from test_app.forms import BookingForm 
In [2]: from test_app.models import Location 

# I had already saved some `Location` instances. 

In [3]: data = dict(name = 'MyCity', place = [p.id for p in Location.objects.all()]) 
In [4]: f = BookingForm(data) 
In [5]: f.save() 
In [6]: for each in Location.objects.all(): 
    ...:  print each.place, each.inuse 
    ...:  
PlaceA True 
PlaceB True 
PlaceC True 
+0

не вызывает никаких ошибок, просто не обновляет значение местоположения до True при сохранении –

+0

Я немного изменил код. Можете ли вы попробовать с последней версией? –

+0

nope еще не повезло. Не ошибается, но, похоже, ничего не делает. –