【问题标题】:Django Update Form?Django 更新表格?
【发布时间】:2014-11-18 17:34:45
【问题描述】:

我有一个表单,用户可以输入位置信息。我正在尝试制作一个更新表单,以便用户可以单击某个位置上的更新按钮,并且更新表单会填充该位置已经存在的数据。我遵循了 Django 文档,但我得到了一个空白屏幕。我不确定如何让它引用要更新的位置。这是我目前所拥有的。

models.py

class Location(models.Model):
    # Details on location

views.py

    def locations(request):
        return render_to_response('locations/locations.html', {'locations': Location.objects.all() })

    def location(request, location_id=1):
        return render_to_response('locations/location.html', {'location': Location.objects.get(id=location_id) })

    def create(request):
        if request.POST:
            form = LocationForm(request.POST, request.FILES)
            if form.is_valid():
                form.save()

                return HttpResponseRedirect('/accounts/loggedin/locations/all/')
        else:
            form = LocationForm()

        args = {}
        args.update(csrf(request))

        args['form'] = form

        return render_to_response('locations/create_location.html', args)

def edit_location(request): 

    if request.POST:
        form = LocationUpdate(request.POST, request.FILES)
        if form.is_valid():
            form.save()

            return HttpResponseRedirect('/accounts/loggedin/locations/all/')
    else:
        form = LocationUpdate()

    args = {}
    args.update(csrf(request))

    args['form'] = form

    return render_to_response('locations/location_update.html', args) 

forms.py

from django.views.generic.edit import UpdateView
from models import Location

class LocationForm(forms.ModelForm):

    class Meta:
        model = Location
        exclude = ('timestamp', 'updated')

class LocationUpdate(UpdateView):
    model = Location
    template_name_suffix = '_update_form'

url.py

url(r'^accounts/loggedin/location/update/$', 'assessments.views.edit_location'),

location_update.html

<!DOCTYPE html>
    <html>
        <head>

        </head>
        <body>
        <form action="" method="post">{% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="update" />
    </form>
        </body>
    </html>

还是应该放在 location.html 中。如果我在其中添加它,我会收到 CSRF verification failed 错误

<div class="row">
        <div class="col-md-4">
            <dl class="dl-horizontal">
                <dt>ID:</dt>
                <dd>{{ location.id }}</dd>
                <br />
                <dt>Company:</dt>
                <dd>{{ location.company }}</dd>
                <dt>Address:</dt>
                <dd>{{ location.address }}</dd>
                <dt>Town:</dt>
                <dd>{{ location.town_city }}</dd>
                <dt>County:</dt>
                <dd>{{ location.county }}</dd>
                <dt>Telephone:</dt>
                <dd>{{ location.tel }}</dd>
                ###### ect #####
    </div>
</div>
<form action="" method="post">{% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="update" />
    </form>    

【问题讨论】:

  • 那是你的 location_update.html 的完整代码吗?您可能不是从另一个模板扩展而来的?
  • 出于测试目的,它刚刚获得了 html 标题和正文标签。一旦它工作,我会将它添加到模板中。它是否需要成为 location.html 的一部分?
  • 我不明白那个回复。那是 location_update.html 的完整代码吗?如果没有,请发布完整的代码。另外,准确地解释你所看到的。你有什么显示吗?当您查看源代码时,您会看到什么?
  • 编辑了问题以包含更多信息。

标签: python django forms


【解决方案1】:

我发现了一些问题:

  1. 您的更新视图与您的创建视图完全相同。
  2. 您正在传递 UpdateView 类作为更新视图中的表单。

如果你要使用更新视图,你不需要将它包装在另一个视图中或将其用作表单,它是完全独立的。

在你的views.py(不是forms.py):

from .models import Location
from .forms import LocationForm

class LocationUpdateView(UpdateView):
    model = Location
    template_name = 'locations/location_update.html'
    form_class = LocationForm
    success_url = '/accounts/loggedin/locations/all/'

在你的urls.py:

url('location/update/(?P<pk>\d+)/$', LocationUpdateView.as_view(),
                                     name='location-update'),

如果你像这样连接它,你需要用你想要更新的位置对象的主键来调用更新视图。这将确保表单中填充了数据;所以这样称呼它&lt;a href="{% url 'location-update' pk=1 %}"&gt;update location id 1&lt;/a&gt;

如果你不想使用基于类的视图,那么你的视图应该更新以首先加载数据,填充表单,然后将表单发送给用户,就像上面的 UpdateView 一样,你需要通过在主键(或其他引用)中,加载您正在为其编辑记录的对象:

def update_location(request, pk=None):
    obj = get_object_or_404(Location, pk=pk)
    form = LocationForm(request.POST or None,
                        request.FILES or None, instance=obj)
    if request.method == 'POST':
        if form.is_valid():
           form.save()
           return redirect('/accounts/loggedin/locations/all/')
    return render(request, 'locations/location_update.html', {'form': form})

【讨论】:

  • 感谢您的详细回复。还帮助了我不确定的 django 的其他领域。最后一件事是,当我单击发布更新“没有要重定向到的 URL”时出现错误。要么提供一个 url,要么在模型上定义一个 get_absolute_url 方法。我用了你建议的第一种方法
  • 完美。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-01-05
  • 2011-03-26
  • 1970-01-01
  • 2012-03-06
  • 2021-02-15
  • 2019-10-10
  • 2014-04-05
  • 2012-06-25
相关资源
最近更新 更多