django IntegrityError (1048, «Столбец hotel_id» не может быть нулевым ») - PullRequest
0 голосов
/ 03 мая 2018

Я новичок, и это мой первый вопрос на этой платформе. я пытаюсь добавить новые комнаты, используя modelform, но получаю IntegrityError (1048, "столбец hotel_id" не может быть пустым "). Мой код, как показано ниже. Я ценю помощь

models.py

class Hotel(models.Model):
    name = models.CharField("Hotel Name", max_length=100)
    owner =  models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE) 

    class Meta:
        verbose_name_plural = "Hotels"

    def __str__(self):
        return self.name

class Rooms(models.Model):
    room_type = models.CharField(max_length=100)
    price = MoneyField(max_digits=65, decimal_places=2, default_currency='USD')
    number_available = models.IntegerField()
    hotel = models.ForeignKey(Hotel,on_delete=models.CASCADE)
    # hotel = models.ForeignKey("Hotel", on_delete=models.CASCADE)

    class Meta:
        verbose_name_plural = "Rooms"

    def __str__(self):
        return self.room_type

views.py

Вот часть вида для обработки формы

def new_room(request):

    if request.method=='POST':
        # hotel = get_object_or_404(Hotel,id =hotel_id)
        user = request.user
        if user:
            form=RoomsForm(request.POST or None)
            if form.is_valid():
                newroom = form.save(commit=False)
                newroom.owner = request.user
                newroom.save()
                return HttpResponseRedirect('/')
    else:
        form = RoomsForm(request.POST or None)
    return render(request,'newroom_form.html', {"form":form})

forms.py

class RoomsForm(forms.ModelForm):
    class Meta:
        model = Rooms
        fields =['room_type','price','number_available']

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Мне удалось получить идентификатор отеля с помощью приведенного ниже кода

def new_room(request):
if request.method == 'POST':
    form = RoomsForm(request.POST or None)
    if form.is_valid():
        instance = form.save(commit=False)
        rooms = Rooms.objects.filter(hotel__owner=request.user)
        for r in rooms:
            instance.hotel_id = r.hotel_id
        instance.user = request.user
        instance.save()
        return HttpResponseRedirect('/dashboard')
else:
    form = RoomsForm()
return render(request, 'newroom_form.html', {"form": form})
0 голосов
/ 04 мая 2018

RoomsForm не содержит поля hotel, поэтому newroom.hotel не заполняется. Когда вы save(), экземпляр Postgres жалуется на отсутствующее значение (ForeignKey по умолчанию равно null = False ).

Поскольку вы, вероятно, не хотите разрешать номера в неизвестных отелях, вам нужно либо указать в форме выбор отеля, либо указать идентификатор отеля в своем URL (например, /hotel/123/new-room/) и указать newroom.hotel вручную.

...