很抱歉給出的所有代碼,但我已經努力了一天,但在將 stage_id 作為引數傳遞到表單操作 url 時仍然遇到問題
我有一個類 Rapports 包含一個檔案(我更喜歡 pdf 檔案)并且與來自其他應用程式的其他類具有 1to1 關系,我正在從 Stages 應用程式中的 html 頁面發送 stage.id 并且它正在作業 id 是通過了,我可以將它傳遞給另一個 html 頁面,但是當我撰寫我需要的代碼并在我想要顯示的模板的 action 屬性中傳遞相同的 url 模式時(rapport/test.html 下面)它回傳 NoReverseMatch 并且我不知道為什么。是因為我正在嘗試上傳檔案還是其他原因?(第一次處理檔案)
{% block rpt %}
<li class="nav-item">
<a class="nav-link" href="{% url 'rapport:depo' stages.id %}">
déposer le rapport
</a>
</li>
{% endblock rpt %}
報告.報告
from django.db import models
from satges.models import Stages
class Rapports(models.Model):
stage=models.OneToOneField(
Stages,
on_delete=models.CASCADE,
primary_key=True,
)
src=models.FileField(
("rapport"),
upload_to='rapports/',
max_length=100
)
r_soummit=models.DateTimeField(
auto_now=False,
auto_now_add=False,
)
satges.Stages
class Stages(models.Model):
#Stages attrs that are saved so i think no need to show them here
def est_ete(self):
# comment: this fn returns true if it's a summer intership
if(self.deb.month in[6,7,8]):
return True
# end def
def get_absolute_url(self):
return reverse("satges:det_stg", kwargs={"pk": self.pk})
#saving Stages to database with CreateView is working
def __str__(self):
return self.etd ' ' self.nature " - " self.au
rapport.forms.py
from django import forms
from .models import Rapports
class RapportsForm(forms.ModelForm):
class Meta:
model = Rapports
fields = ['src']
widgets = {
'src': forms.FileInput(),
}
融洽的意見
from django.http import HttpResponse
from django.shortcuts import get_object_or_404, render
from django.views.generic import CreateView
from satges.models import Stages
from .models import Rapports
from .forms import RapportsForm
# Create your views here.
def afficher(request, stage_id):
# comment:
#return HttpResponse('stage: %s'% stage_id)
if request.method == 'POST':
form = RapportsForm(request.POST, request.FILES)
else:
form=RapportsForm()
return render(request, 'rapport/test.html', {'form': form})
class RapportCreateView(CreateView):
model = Rapports
form_class=RapportsForm
template_name = "rapport/test.html"
# end def
'''
def afficher_depo(request, stage_id):
form=RapportsForm()
print(stage_id)
return render(request,'rapport/depo.html', {'form': form})
def depo(request, stage_id):
if request.method == 'POST':
form = RapportsForm(request.POST)
stage=get_object_or_404(Stages, pk=stage_id)
src = form.cleaned_data['src']
rpt=Rapports(stage=stage,src=src)
rpt.save()
else:
return HttpResponse('rapport isn\'t saved')
return render(request,'rapport/depo.html', {'form':form})
'''
專案 url 配置
from django.contrib import admin
from django.urls import include, path
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('satges.urls')),
path('journal/', include('journaux.urls')),
path('rapport/<int:pk>', include('rapport.urls')),
] static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
rapport.urls.py
from django.urls import path, re_path
from . import views
app_name = 'rapport'
urlpatterns = [
path('',views.RapportCreateView.as_view(), name='depo'),
]
test.html(此檔案僅用于測驗名為 depo.html 的主檔案,它擴展了頁面,并且當我洗掉表單出現的操作中的 url 時具有相同的行為)
<html>
<head>
<title>test</title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="{% url 'rapport:depo' satge_id %}">
<!--when i remove the url tag the input form appears and i can choose a file but i ofc can't send it without the action-->
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="déposer votre rapport" name="depo">
</form>
</body>
</html>
這應該是與問題相關的所有代碼,我嘗試過谷歌搜索、youtube、django doc,并且隨著我當天所做的更改,錯誤有所不同,但我無法通過的是NoReverseMatch
錯誤
Error during template rendering
In template /home/ssoya/Documents/pfe/new/pages/templates/rapport/test.html, error at line 6
Reverse for 'depo' with arguments '('',)' not found. 1 pattern(s) tried: ['rapport/(?P<pk>[0-9] )\\Z']
在第一個答案之后,我的觀點變成了這樣,但無論我改變它仍然沒有用
class RapportsCreateView(CreateView):
model = Rapports
form_class=RapportsForm
template_name = "rapport/depo.html"
def get_context_data(self, **kwargs):
context=super(RapportsCreateView, self).get_context_data(**kwargs)
#stage=Stages.objects.get(pk=self.kwargs.get('pk'))
context['stages'] = Stages.objects.filter(pk=self.kwargs.get('pk'))
return context
然后我嘗試了其他方法:我將 stage.id 替換為 1 然后 13 看看會發生什么。它引發了IntegrityError
NOT NULL constraint failed: rapport_rapports.stage_id
The above exception (NOT NULL constraint failed: rapport_rapports.stage_id) was the direct cause of the following exception:
response = get_response(request)
一旦我找到一個解決方案或更多地理解它,我愿意重新構建問題
uj5u.com熱心網友回復:
這是因為 stage_id 因為它沒有定義所以不會找到 url 因為它需要引數 stage_id,檢查渲染你的模板的視圖它沒有重新調整 stage_id 變數
將它添加到你的創建視圖
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super().get_context_data(**kwargs)
# context is a dict so
#update it with your stage id
return context
在此函式中添加 stage_id 以便將其傳遞給模板
uj5u.com熱心網友回復:
我可以說它已經解決了 90%
我在這個問題中遇到的問題與我認為的背景關系有關,在@mohamed 的回答和一些谷歌搜索和嘗試之后,我使視圖最終正常作業并將檔案保存到服務器和資料庫,并將 id Satges 物件作為 rapport 的 id 作為屬性 satge_id 然后將用戶重定向到另一個頁面
這是我所做的修改
視圖.py
class RapportsCreateView(CreateView):
model = Rapports
form_class = RapportsForm
template_name = "rapport/depo.html"
def form_valid(self, form):
self.stage_id = self.kwargs['pk']
stage = Stages.objects.get(id=self.stage_id)
form.instance.stage_id = stage.id
form.instance.r_soummit = timezone.now()
return super().form_valid(form)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
stage = Stages.objects.get(pk=self.kwargs.get('pk'))
context['stage'] = stage
context['stage_id'] = stage.id
return context
模型.報告
def get_absolute_url(self):
return reverse("rapport:det_rpt", kwargs={"pk": self.pk})
def __str__(self):
return self.src
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/493629.html
