如何允许用户提交表单

问题描述 投票:0回答:1

当我尝试使用

Table
视图将
create_table
模型提交到数据库时,它抛出一个错误:
NOT NULL constraint failed: audioApp_table.user_id
在我自己研究之后我发现这是因为我没有将用户添加到表单,所以我尝试通过添加:
table = Table(user=request.user)
来添加它,但它不起作用,我们如何允许用户提交此表单,我知道如何使用
class base view
instance.user = self.request.user
中做到这一点,但是对于
function base view
我失败了

def create_table(request):
    columns = Column.objects.filter(user=request.user)

    fields = {}
    for column in columns:
        if column.field_type.data_type == 'number':
            fields[column.name] = forms.IntegerField()

        elif column.field_type.data_type == 'character':
            fields[column.name] = forms.CharField(max_length=20)

        elif column.field_type.data_type == 'decimal':
            fields[column.name] = forms.DecimalField(max_digits=20, decimal_places=10)

        elif column.field_type.data_type == 'image':
            fields[column.name] = forms.ImageField()

        elif column.field_type.data_type == 'boolean':
            fields[column.name] = forms.BooleanField()

        elif column.field_type.data_type == 'date':
            fields[column.name] = forms.DateField()
    TableForm = type('TableForm', (forms.Form,), fields)

    if request.method == 'POST':
        form = TableForm(request.POST, request.FILES)

        if form.is_valid():

            table = Table()

            for column in columns:
                setattr(table, column.name, form.cleaned_data[column.name])
                table.save()
                return redirect('Table')
    else:
        form = TableForm()
    return render (request, 'create_table.html', {'form':form})
class Table(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    number = models.IntegerField(blank=True, null=True)
    decimal = models.DecimalField(max_digits=20, decimal_places=10, blank=True, null=True)
    image =  models.ImageField(upload_to='table-image', blank=True, null=True)
    character = models.CharField(max_length=500, blank=True, null=True)
    check_box = models.BooleanField(blank=True, null=True)
    date = models.DateField(blank=True, null=True)
python django
1个回答
0
投票

在将Table实例保存到数据库之前,您需要为Table实例设置用户。您可以通过在 create_table 视图函数中创建表实例后将 table.user 设置为 request.user 来做到这一点

 if request.method == 'POST':
        form = TableForm(request.POST, request.FILES)

        if form.is_valid():
            table = Table()
            table.user = request.user 

            for column in columns:
                setattr(table, column.name, form.cleaned_data[column.name])

            table.save()
            return redirect('Table')
    else:
        form = TableForm()

    return render(request, 'create_table.html', {'form': form})
© www.soinside.com 2019 - 2024. All rights reserved.