如何在 Django 表单中显示变量?

How to display a variable in Django forms?

我正在尝试使用我的数据库的值在表单中显示它。因此,如果用户之前已经填写了一个值,他们将在再次访问该页面时看到它。

所以有我的 HTML 文件 :

<div class="form-group row">
    <label class="col-4 mt-1 text-right">Modèle</label>
    <div class="col-4">
      {{ form.model }}
    </div>
</div>

我的 views.py 文件:

def get_car(request, identifiant):
    if request.method == "POST":
        form = CarForm(request.POST)
        if form.is_valid():
            car_instance = Car(
                identifiant,
                form.cleaned_data["model"]
            )
            car_instance.save()
            return HttpResponseRedirect("/forms/car/{}".format(identifiant))
    else:
        form = CarForm()
        form.identifiant = identifiant
    return render(request, "forms/car.html", {"form": form}) 

我的 models.py 文件:

class Car(models.Model):
    model = models.CharField(max_length=16)

(主键是自动创建的)

还有我的 forms.py 文件:

class CarForm(forms.Form):
    model = forms.CharField(label="Modèle", max_length=32, widget=forms.TextInput({ "value": Car.objects.get(pk=1).model}))

我们可以在表单文件中看到我给pk赋了一个值,所以代码会从我的数据库中pk = 1的用户那里搜索这个值。我的问题是如何给出活跃用户的pk值?

使用 form = CarForm() 创建一个空表单实例。难怪表格显示为空。 我强烈建议您切换到基于 class 的视图(UpdateView 和 CreateView),因为它们正是为此类用途创建的,并且非常容易实现。

无论如何,您在这里需要做的就是使用您计划更新的对象生成表单实例。

我猜 identifiant 是汽车 ID(?)

car = Car.objects.get(id=identifiant)
form = CarForm(instance=car)

我还建议您为汽车使用 ModelForm 而不是标准表单,因为您只收集“汽车”模型中的单个字段“模型”。

class CarForm(forms.ModelForm):
    class Meta:
        fields = ['model']
        widgets = {
            'model' : forms.TextInput(),
        }
        labels = {
            'model' : 'Modèle'
        }

您可以通过这种方式添加其他属性。你真的可以从那里添加任何你想要的东西。例如:

class CarForm(forms.ModelForm):
    class Meta:
        fields = ['model']
        widgets = {
            'model' : forms.TextInput(attrs={
                'placeholder': '12345678',
                'class' : 'shadow-sm',
                'onClick' : "myFunction(this);"
            }),
        }
        labels = {
            'model' : 'Modèle'
        }

你放在那里的任何东西都会在现场呈现。因此,如果您添加 css classes,您可以将它们全部放在同一行中。例如 'class' : 'shadow-sm mx-3 bold-p text-responsive'