当前位置: 首页 > 知识库问答 >
问题:

使用Django从数据库中预填充HTML表单表

糜鸿风
2023-03-14

我有一个基于类的视图(IndexView at views.py),它显示了一个包含数据库中存储的所有数据的表。此视图在索引中呈现。html使用def get_queryset(self)获取所有数据。还没有问题。

对我来说,困难的部分是尝试使用表单来完成它,以便能够修改和保存金额列。我对POST部分没有问题,我使用AJAX来保存新值。我遇到的问题是从数据库中获取初始值以填充Django表单(forms.py)

我尝试在表单字段的定义中使用初始参数(forms.py),甚至在表单定义中覆盖__init__,但我不知道如何获得“一个值”。我的意思是,我在测试中越接近使用以下内容填充MultipleChoiceField:表单。ModelMultipleChoiceField(queryset=Item.objects.order_by('code__name'))(实现Item对象(1)、Item对象(2)等的多选字段。

但是如何用数据库的内容填充单个IntegerField或CharField,以在模板中显示基于表单的表字段呢?

我首先尝试使用单个项目(尝试了解如何引用一个项目/值以使用数据库填充它们),然后再使用整个表:

index.hml:

...
  <form class='my-ajax-form' method='POST' action='.' data-url='{{ request.build_absolute_uri|safe }}'>
    {% csrf_token %}
    {{form.as_table|safe}}
    <button type='submit'>Save changes</button>
  </form>
...

模型。py:

class Code(models.Model):
    name = models.CharField(max_length=6)
    description = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Item(models.Model):
    code = models.ForeignKey(Code, on_delete=models.DO_NOTHING)
    amount = models.IntegerField(default=0)

形式。py:

class ItemForm(forms.Form):
    code = forms.CharField(max_length=6)
    description = forms.CharField(max_length=100)
    amount = forms.IntegerField()

意见。py:

class IndexView(generic.ListView, AjaxFormMixin, FormView):
    template_name = 'inventory/index.html'
    context_object_name = 'items_list'
    form_class = ItemForm

    def form_invalid(self, form):
        ...

    def form_valid(self, form):
        ...

    def get_queryset(self):
        ...

我查了这些文件

  • https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/#a-完整示例

我使用的是Django 2.0.2

任何帮助都将不胜感激。提前感谢。

编辑:按照安迪的建议,尝试使用UpdateView做一些事情。添加(试图通过id获取一个值):

class ItemUpdate(UpdateView):
    form_class = JoinForm

    def get_object(self,queryset=None):
        obj = Item.objects.get(id=self.kwargs['2'])
        return obj

并将url指向路径(“”,views.ItemUpdate.as_view(),name='index'),但始终获取keyrerror:'2'

共有3个答案

轩辕嘉平
2023-03-14

可以做的一件事是遍历项目列表,并将每个字段的输入标记的value属性设置为form。字段名称。价值

水浩歌
2023-03-14

据我所知,将数据加载到表单中有多种方式:

  • 在views.py

您正在使用FormViewCBV,它有一个名为get_initial的函数:

    def get_initial(self):
        initial = super().get_initial()
        initial['<form-field>'] = <initial-value>
        return initial
  • 在形式上。py

您可以覆盖初始化功能

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['<form-field>'].initial = <initial-value>
欧阳向文
2023-03-14

使用django的generic怎么样。意见。通用的编辑导入更新视图直接在模型上?

https://docs.djangoproject.com/en/2.0/ref/class-based-views/generic-editing/#updateview

意见。py:

from django.forms import ModelForm, CharField, Textarea
from django.urls import reverse_lazy
from django.views.generic import UpdateView

from demo.models import Item


class ItemForm(ModelForm):
    description = CharField(widget=Textarea)

    class Meta:
        model = Item
        fields = ['code', 'amount']

    def save(self, commit=True):
        item = super(ItemForm, self).save(commit=commit)
        item.code.description = self.cleaned_data['description']
        item.code.save()

    def get_initial_for_field(self, field, field_name):
        if field_name == 'description':
            return self.instance.code.description
        else:
            return super(ItemForm, self).get_initial_for_field(field, field_name)


class ItemUpdateView(UpdateView):

    form_class = ItemForm
    model = Item

    def get_success_url(self):
        return reverse_lazy('item-detail', kwargs={'pk': 1})

网址。py

from django.conf.urls import url
from django.contrib import admin
from django.urls import path


from demo.views import ItemUpdateView

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    path(r'items/<int:pk>/', ItemUpdateView.as_view(), name='item-detail')
]

/templates/demo/item_form.html

<form action="" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Update" />
</form>

如果有关设置或配置的内容不清楚,请参阅repo和演示:https://github.com/andilabs/cbv

添加了模型表单集,在ListView中生成您需要的内容

from django.forms import modelformset_factory


class ItemListView(ListView):
    model = Item

    def get_context_data(self, **kwargs):
        data = super(ItemListView, self).get_context_data()
        formset = modelformset_factory(Item, form=ItemForm)()
        data['formset'] = formset
        return data

这只是在表单中显示数据,您需要处理rest。

 类似资料:
  • 我有一个有两列的表,一个是string,另一个是double Type。例如, 我正在尝试读取所有的值,并将它们加载到中 我在读取表数据方面没有任何问题,但不能按我的要求将它们放入HashMap中。 我编写了一个示例代码来从两个不同的数组(string和double)填充一个HashMap,但仍然无法处理HashMap的值部分,它是一个数组。 任何建议我如何处理HashMap的值部分,它是一个数组

  • //内容提供程序代码 公共静态最终字符串授权=“com.battlestarMathematica.stayfresh.pantryprovider”; //游标加载程序代码

  • 问题内容: 作为HTML表单的一部分,我要创建一个下拉列表,其中将列出数据库中的所有用户名。 我以为以下代码可以解决问题,但下拉列表为空-有人可以帮我解决我做错的事情吗?谢谢。 问题答案: 我的猜测是您有问题,因为在循环之后您没有关闭选择标签。可以做到这一点吗?

  • 问题内容: 我需要有关ajax的帮助。我想更新一个php文件,它将更新数据库。我有一个表格,它将选中的复选框发送到一个php文件,然后更新数据库。我想用ajax做到这一点,但我为此感到挣扎。我知道如何通过Ajax 更新HTML元素,但是无法解决。 HTML脚本 PHP updateDB.php 我希望此更新无需刷新页面。 问题答案: 我只想要一些建议,首先您的html页面代码应该喜欢- 现在我转向

  • 问题内容: 我正在尝试使用我的Derby数据库数据填充Netbeans GUI-builder jTable。 我在Account.java类中使用以下代码: 理想情况下,我希望能够返回其中包含参数数据和列的tableModel,因为我知道在GUI中执行此方法是一种不好的做法。在线上的所有教程都没有显示如何将数据发送到另一个类,它们只是在GUI类中执行数据库代码。 我有一个错误,它看不到数据和列,

  • 我在Account.java类中使用以下代码: 理想情况下,我希望能够返回包含参数数据和列的tableModel,因为我知道在我的GUI中使用这种方法是不好的做法。所有在线教程都没有显示如何将数据发送到另一个类,它们只是在GUI类中执行数据库代码。 我有一个错误,它无法看到数据和列,因为它们是在我的方法的一个不可访问的部分中声明和使用的。在我完成这些之后,我需要找到一种方法来将它传递给我的GUI类