【问题标题】:Django Saving A Model With Form + Current User DataDjango用表单+当前用户数据保存模型
【发布时间】:2018-12-12 14:27:27
【问题描述】:

我正在用 django 编写我的第一个应用程序,但遇到了问题。我正在尝试建立一个预订系统。我正在尝试保存预订模型。当用户注销时它工作得很好。但是一旦我在登录时点击提交,什么都没有发生。该网站只是重新加载。谁能指出我做错了什么? 这是我的模型代码:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    name = models.CharField(max_length = 100)
    surname = models.CharField(max_length = 100)
    phone = models.CharField(max_length = 9)

class Reservation(models.Model):
    reservationID = models.AutoField(primary_key = True)
    name = models.CharField(max_length = 100)
    surname = models.CharField(max_length = 100)
    phone = models.CharField(max_length = 9)
    email = models.EmailField()
    bookIn = models.DateField('Book in date', default = timezone.now)
    bookOut = models.DateField('Book out date', default = timezone.now)
    roomType = models.ForeignKey(Room_type, on_delete = models.CASCADE)

我的表格:

class Booking(forms.ModelForm):

class Meta:
    model = Reservation
    fields = ('name', 'surname', 'phone', 'email', 'roomType', 'bookIn', 'bookOut',)
    widgets = {
        'bookIn': forms.DateInput(attrs={'class': 'datepicker'}),
        'bookOut': forms.DateInput(attrs={'class': 'datepicker'})
        }

我的看法:

form = Booking()
if request.method == 'POST':
    form = Booking(request.POST)
    if form.is_valid():
        if request.user.is_authenticated:
            reservation = Reservation()
            guest = Profile.objects.get(user=request.user)
            reservation.name = guest.name
            reservation.surname = guest.surname
            reservation.phone = guest.phone
            reservation.email = guest.user.email
            reservation.bookIn = form.cleaned_data.get('bookIn')
            reservation.bookOut = form.cleaned_data.get('bookOut')
            reservation.roomType = form.cleaned_data.get('roomType')
            reservation.save()

        else:
            reservation = form.save()
            reservation.save()

        n = reservation.pk
        return redirect('bookSuccess', n)
return render(request, 'hotel/bookRoom.html', {'form' : form})

【问题讨论】:

    标签: python django django-models django-forms django-views


    【解决方案1】:

    我假设您的表单由于某种原因没有验证,您需要抓住它以查看可能出现的问题。所以你可以像这样更新你的视图:

    form = Booking(request.POST or None)
    if request.method == 'POST':
        if form.is_valid():
            if request.user.is_authenticated:
                reservation = form.save(commit=False)
                # optimized the code
                guest = Profile.objects.get(user=request.user)
                reservation.name = guest.name
                reservation.surname = guest.surname
                reservation.phone = guest.phone
                reservation.email = request.user.email
                reservation.save()
            else:
                reservation = form.save()  # removed duplicate save
    
            n = reservation.pk
            return redirect('bookSuccess', n)
    return render(request, 'hotel/bookRoom.html', {'form' : form})
    

    更新

    您无需在模型字段中输入 null trueblank true。您可以将user 数据从视图传递到表单。如果用户已通过身份验证,则弹出已验证用户不需要的字段。像这样:

    class Booking(forms.ModelForm):
    
          def __init__(self, *args, **kwargs):
               user = kwargs.pop('user')
               super(Booking, self).__init__(*args, **kwargs)
               if user.is_authenticated:
                   self.fields.pop('name')  # or make them required false like this:  self.fields['name'].required = False
                   self.fields.pop('surname')
                   # other fields unnecessary for authenticated user
          # rest of the code
    

    并像这样在视图中使用此表单:

    form = Booking(request.POST or None, user=request.user)
    

    【讨论】:

    • 它没有验证,因为字段名称、姓氏等是必需的。我可以通过在模型中添加“blank=true”来克服这个问题,但这会给匿名用户带来问题,因为他们可以在没有这些字段的情况下预订房间。有没有办法让匿名用户需要它而登录用户不需要它?
    • 谢谢,我明天试试!
    猜你喜欢
    • 2012-03-19
    • 2012-06-15
    • 2015-08-16
    • 2020-10-16
    • 2021-01-27
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多