当我尝试使用
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)
在将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})