【问题标题】:Django - Unable to Redirect to Update Form and Update ValuesDjango - 无法重定向以更新表单和更新值
【发布时间】:2021-04-15 08:07:58
【问题描述】:

我准备了一个 django 应用程序,该应用程序将在用户登录后接受用户的输入。一旦用户登录,他们就可以输入值以形成并将其发布到数据库。但是,我需要为用户提供基于共轭主键StationDate 更新现有条目的能力。我在form 页面上添加了一个update 按钮来更新条目,以防用户输入已经存在的主键的值。

我需要实现两件事

  • 仅当用户为已经存在的主键输入值时才启用更新按钮。
  • 虽然更新按钮已启用,但我无法重定向到update_form 页面。

目前我无法弄清楚为什么我不能重定向到update_form 页面。我收到以下错误 django.urls.exceptions.NoReverseMatch: Reverse for 'update_form' with arguments '('',)' not found. 1 pattern(s) tried: ['\\^\\(\\?P(?P<pk>[^/]+)\\[0\\-9\\]\\+\\)/update_form/\\$$']

以下是正在使用的所有相关脚本:

Models.py

from django.db import models
from django import forms
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User

# Create your models here.
class ManHour(models.Model):
    class Meta:
        unique_together = (('date', 'station'),)

    station_choices = (
       ('KHI','Karachi'),
       ('ISB', 'Islamabad'),
       ('LHE','Lahore'),
       )

    station = models.CharField(
        max_length=3,
        choices=station_choices,
    )
    date = models.DateField()
    date_time  = models.DateTimeField(auto_now=True)
    imports_airside = models.DecimalField(max_digits= 5, decimal_places= 3, default = 0)
    imports_landside = models.DecimalField(max_digits= 5, decimal_places= 3, default = 0)
    exports = models.DecimalField(max_digits= 5, decimal_places= 3, default = 0)

Views.py

from django.shortcuts import render, redirect
from django.template.context_processors import csrf
from django.http import HttpResponse
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth import login, logout, authenticate
from django.contrib import messages
from .form import InputForm
from django.urls import reverse
from django.contrib.auth.decorators import login_required
from manhourapp.models import ManHour
from django.utils.decorators import method_decorator
from django.contrib.auth.models import User
from django.db import IntegrityError  
from django.shortcuts import render_to_response
from django.http import HttpResponse


# Create your views here.
def login_request(request):
    if request.method == 'POST':
        form = AuthenticationForm(request=request, data=request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(username=username, password=password)
            if user is not None:
                login(request, user)
                messages.info(request, f"You are now logged in as {username}")
                return redirect('form')
            else:
                messages.error(request, "Invalid username or password.")
        else:
            messages.error(request, "Invalid username or password.")
    else:
        form = AuthenticationForm()
    return render(request = request,
                    template_name = "login.html",
                    context={"form":form})



@login_required(login_url='login')
def form_page(request):
    context = {}
    try:
        man_hour = ManHour.objects.get(pk=request.GET.get("pk"))
    except ManHour.DoesNotExist:
        man_hour = None

    if man_hour:
        context["Total_Imports"] = man_hour.imports_airside + man_hour.imports_landside
    if man_hour:
        context["Total_Hours"] = man_hour.imports_airside + man_hour.imports_landside + man_hour.exports

    if request.method == 'POST':
        properties_Form = InputForm(request.POST, instance=man_hour)
        if properties_Form.is_valid():
            obj = properties_Form.save()
            return redirect("%s?pk=%s" % (reverse('form'), obj.pk))
        else:
            context['form'] = properties_Form
            return render(request, "form.html", context)
    else:
        context['form']= InputForm(instance=man_hour)
        return render(request, "form.html", context)

@login_required(login_url='login')
def update_form(request, pk):
    man_hour = ManHour.objects.get(id=pk)
    form = InputForm(instance=man_hour)
    if request.method == 'POST':
        properties_Form = InputForm(request.POST, instance=man_hour)
        if properties_Form.is_valid():
            obj = properties_Form.save()
            return redirect("%s?pk=%s" % (reverse('update_form'), obj.pk))

    else:
        context = {'form':form}
        return render(request, 'update_form.html', context)

form.py

from django import forms
from manhourapp.models import ManHour
from datetime import date

class DateInput(forms.DateInput):
    input_type = 'date'

class InputForm(forms.ModelForm):
    class Meta:
        model = ManHour
        fields = ['date','station', 'imports_airside', 'imports_landside', 'exports']
        widgets = {
            'date':forms.widgets.DateInput(attrs={'type': 'date', 'max':str(date.today())})
        }

urls.py

from django.contrib import admin
from django.contrib.auth import views as auth_views
from django.urls import path
from pages import views
from django.contrib.auth.views import LogoutView
from django.conf.urls import url
from django.conf import settings

urlpatterns = [
    path('home/', views.home_view, name='home'),
    path('admin/', admin.site.urls),
    path('login/', views.login_request, name='login'),
    path('form/', views.form_page, name='form'),
    path('update_form/<int:pk_>/', views.update_form, name='update_form'),
    path("logout/", LogoutView.as_view(), name="logout"),

]

form.HTML

<!DOCTYPE html>
<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js" async></script>
    </head>
    <body>
      

        <form target="upload_frame" action="." method="post" enctype="multipart/form-data" >
            {% csrf_token %}
            {{ form.as_p }}<br>
            <input type="text" name="Total_Imports" value="{{ Total_Imports }}" class="form-control" disabled><br>
            <input type="text" name="Total_Hours" value="{{ Total_Hours }}" class="form-control" disabled><br>
            <input type="submit" name="submit" value="Upload" id="submit">
            <a class="btn btn-sm btn-info" href="update_form/<int:pk_>">Update</a>
            <div class="user_panel">
                <a href="/logout">logout</a>
            </div>
        </form>           
    </body>
</html>

update_form.html

<!DOCTYPE html>
<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js" async></script>
    </head>
    <body>
      

        <form target="upload_frame" action="." method="post" enctype="multipart/form-data" >
            {% csrf_token %}
            {{ update_form.as_p }}<br>
            <input type="text" name="Total_Imports" value="{{ Total_Imports }}" class="form-control" disabled><br>
            <input type="text" name="Total_Hours" value="{{ Total_Hours }}" class="form-control" disabled><br>
            <input type="submit" name="submit" value="Upload" id="submit">
            <div class="user_panel">
                <a href="/logout">logout</a>
            </div>
        </form>           
    </body>
</html>

【问题讨论】:

    标签: python django django-views django-forms primary-key


    【解决方案1】:

    在第一次重定向中,您必须在调用 url 名称之前输入“reverse”。

    而不是

    return redirect("%s?pk=%s" % (reverse('update_form'), obj.pk))
    

    试试

    return redirect(reverse('update_form', kwargs={'pk': obj.pk}
    

    【讨论】:

    • 我收到一个错误页面未找到The current path, form/update_form/&lt;int:pk_&gt;, didn't match any of these urls.
    • 尝试删除action="."在你的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    相关资源
    最近更新 更多