如何在Django中使用表单发布登录用户的数据?

How to post data of logged in user with a form in Django?

我正在创建一个表单,供用户在我的Web应用程序上预订时间。目前我有以下文件。

见Forms.py:

1
2
3
4
5
6
7
8
9
class BookingForm(forms.ModelForm):
    usname = User.username
    daterequired = forms.CharField(max_length=60, required=True)
    students = forms.CharField(max_length=60, required=True)
    length = forms.CharField(max_length=60, required=True)

    class Meta:
        model = Booking
        fields ="__all__"

参见models.py:

1
2
3
4
5
class Booking(models.Model):
    usname = User.username
    daterequired = models.DateField(_("Date"), default=datetime.date.today)
    students = models.CharField(max_length=200)
    length = models.CharField(max_length=40, blank=True)

请参见views.py:

1
2
3
4
5
6
7
8
9
10
11
@login_required
def choose(request):
    if request.method == 'POST':
        form = BookingForm(request.POST)
        if form.is_valid():
            form = form.save(commit=False)
            form.save()
            return redirect('index')
    else:
        form = BookingForm()
    return render(request, 'choose.html', {'form': form})

我试图实现的是,当用户单击表单上的提交时,他们的用户数据会自动记录到数据库的预订表中。表中记录的唯一数据是日期字段、学生和长度。我需要知道哪个用户发布了这些数据。

有人能帮忙吗?


首先是模型。您定义usname的方式无效。更改为:

1
2
3
4
5
class Booking(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    daterequired = models.DateField(_("Date"), default=datetime.date.today)
    students = models.CharField(max_length=200)
    length = models.CharField(max_length=40, blank=True)

然后将表单更改为:

1
2
3
4
class BookingForm(forms.ModelForm):
    class Meta:
        model = Booking
        exclude = ['user', ]

如果使用ModelForm,则不需要重新定义字段。

运行makemigrationsmigrate。最后,将choose()中的代码更改为:

1
2
3
4
5
if form.is_valid():
    form = form.save(commit=False)
    form.user = request.user
    form.save()
    return redirect('index')