如何让用户在Django中通过HTML更新数据库中的数据?

pinkon5k  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(155)

我想做的是
1.通过HTML页面向用户显示数据库中的现有数据。
1.让用户更新现有的数据,如果他想这样做。
Promblem 1>问题是,当运行我的代码时,用户输入新数据并单击“更新”按钮,但更新不起作用。
问题2>我在模型中设置备注字段如下:memo=models.CharField(max_length=100)然而,在运行代码后,它只显示了HTML中长字符中的一个字符。
请参考以下代码和结果图像。
<models.py>

class Memo(models.Model):
    memo = models.CharField(max_length=100)
    user_input = models.CharField(max_length=100)

    def __str__(self):
        return f" {self.memo} | {self.user_input} "

字符串
<forms.py>

from django import forms 
from report.models import Upload, Memo

class UploadFileForm(forms.ModelForm):
    class Meta:
        model=Upload
        fields=('upload_file',)
        
class InputForm(forms.Form):
    memo = forms.CharField()
    user_input = forms.IntegerField()


<views.py>

def input(request):
    items = Memo.objects.all()

    if request.method == 'POST':
        form = InputForm(request.POST)
        if form.is_valid():
            # Get the item instance based on the memo from the form
            memo = form.cleaned_data['memo']
            item = Memo.objects.get(memo=memo)

            # Update the item with the new data from the form
            item.memo = form.cleaned_data['memo']
            item.user_input = form.cleaned_data['user_input']

            # Update other fields as needed

            item.save()
            return redirect('report/success.html')  # Redirect to the table display page after updating

    else:
        form = InputForm()

    return render(request, 'report/input.html', {'items': items, 'form': form})


<input.html>

<!-- update_table_template.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Update Table Data</title>
</head>
<body>
    <h1>Table Data</h1>
    <table>
        <tr>
            <th>적요</th>
            <th>구분</th>
            <th>변경사항</th>
        </tr>
        {% for item in items %}
        <tr>
            <td>{{ item.memo }}</td>
            <td>{{ item.user_input }}</td>
            <td>
                <form method="post" action="">
                    {% csrf_token %}
                    <input type="text" name="memo" value="{{ item.memo }}">
                    <input type="text" name="user_input" value="{{ item.user_input }}">
                    <!-- Add other fields as needed -->
                    <input type="submit" value="Update">
                </form>
            </td>
        </tr>
        {% endfor %}
    </table>
</body>
</html>


x1c 0d1x的数据
我真的很感谢你的帮助。- 谢谢-谢谢

qncylg1j

qncylg1j1#

当然,这里有一个完整的回应,包含了你所有的笔记:
您面临着几个问题:
1.数据更新不起作用。

  1. memo字段在HTML中只显示一个字符,尽管它应该允许最多100个字符。
    1.在表单中,user_input字段使用的是IntegerField,应该是CharField
    1.您使用的是常规的Form,而ModelForm可以简化代码。
    以下是这些问题的解决方案:
    解决方案1:
    在表单的隐藏字段中包含每个Memo示例的ID。这样,当表单提交时,您就可以确切地知道需要更新数据库中的哪个对象。
    按如下方式修改模板:
<!-- update_table_template.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Update Table Data</title>
</head>
<body>
    <h1>Table Data</h1>
    <table>
        <tr>
            <th>적요</th>
            <th>구분</th>
            <th>변경사항</th>
        </tr>
        {% for item in items %}
        <tr>
            <td>{{ item.memo }}</td>
            <td>{{ item.user_input }}</td>
            <td>
                <form method="post" action="">
                    {% csrf_token %}
                    <!-- The hidden input field -->
                    <input type="hidden" name="id" value="{{ item.id }}">
                    <input type="text" name="memo" value="{{ item.memo }}">
                    <input type="text" name="user_input" value="{{ item.user_input }}">
                    <!-- Add other fields as needed -->
                    <input type="submit" value="Update">
                </form>
            </td>
        </tr>
        {% endfor %}
    </table>
</body>
</html>

字符串
调整您的视图,以便在从数据库中获取对象时使用此ID:

def input(request):
    items = Memo.objects.all()

    if request.method == 'POST':
        form = MemoForm(request.POST)
        if form.is_valid():
            # Get the ID from the form data
            item_id = request.POST.get('id')

            # Fetch the item by ID
            item = Memo.objects.get(id=item_id)

            # Update the item with the new data from the form
            item.memo = form.cleaned_data['memo']
            item.user_input = form.cleaned_data['user_input']

            # Update other fields as needed

            item.save()
            return redirect('success')  # Redirect to a URL pattern named 'success'

    else:
        form = MemoForm()

    return render(request, 'report/input.html', {'items': items, 'form': form})


解决方案二:
1.打开Django admin或从控制台获取备忘录项目,并检查数据库中的真实的值。
1.检查浏览器中的原始HTML,可能是CSS隐藏的字符或视图外部的字符。
解决方案3:
在您的表单中将user_input更改为CharField,如有必要,还可以在您的模型中更改:

class InputForm(forms.Form):
    memo = forms.CharField()
    user_input = forms.CharField()


解决方案4:
使用ModelForm简化表单处理:

from django import forms 
from .models import Memo

class MemoForm(forms.ModelForm):
    class Meta:
        model = Memo
        fields = ['memo', 'user_input']


并调整您的视图以使用此新的ModelForm

def input(request):
    items = Memo.objects.all()

    if request.method == 'POST':
        form = MemoForm(request.POST)
        if form.is_valid():
            # Get the ID from the form data
            item_id = request.POST.get('id')

            # Fetch the item by ID
            item = Memo.objects.get(id=item_id)

            # Update the item with the new data from the form
            item.memo = form.cleaned_data['memo']
            item.user_input = form.cleaned_data['user_input']

            # Update other fields as needed

            item.save()
            return redirect('success')  # Redirect to a URL pattern named 'success'

    else:
        form = MemoForm()

    return render(request, 'report/input.html', {'items': items, 'form': form})


上述解决方案应该可以解决你的问题,并改善你在Django中的表单处理。

相关问题