我想在 Django 中将变量从一个视图传递到另一个视图,但不确定最好的方法。
下面的“defaultCreateView”是一个表单,用于创建新的数据库条目,并且有一个我想要自动填充的必填字段(device_id)。所以我的想法是我可以在 URL 中传递它。使用下面我的模板中显示的按钮可以访问此表单。所以想法是,第一个视图将变量传递给按钮所在的模板,然后该按钮通过 href 将 device_id 添加到 URL。
有没有更简单/更好的方法来实现这一点?
预先感谢您的帮助。
urls.py
urlpatterns = [
path('<int:pk>/edit/', defaultUpdateView.as_view(), name='default_edit'),
path('<int:pk>/', defaultDetailView.as_view(), name='default_detail'),
path('<int:pk>/delete/', defaultDeleteView.as_view(), name='default_delete'),
path('<int:device>', DefaultsListView.as_view(), name='Default_Listview'),
path('<int:device>/new/', defaultCreateView.as_view(), name='default_new'),
path('Defaultsapidata/', apiDefaultsListView.as_view(), name='Defaults_apidata_list'),
path('<int:pk>/changedefaults/', changeDefaultsViewSingle.as_view()),
]
Views.py
class DefaultsListView(LoginRequiredMixin,ListView):
model = models.DefaultDMLSProcessParams
template_name = 'defaults_list.html'
login_url = 'login'
def get_queryset(self):
return super(DefaultsListView, self).get_queryset().filter(device_id=self.kwargs['device'])
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
deviceID = self.kwargs['device']
context['deviceID'] = deviceID
return context
class defaultCreateView(LoginRequiredMixin,CreateView):
model = models.DefaultDMLSProcessParams
template_name = 'default_new.html'
fields= ['defaultParamDescrip','processType','processNotes',]
login_url = 'login'
def form_valid(self, form):
form.instance.customerTag = self.request.user.customerTag
form.instance.device_id = self.kwargs['device']
return super().form_valid(form)
defaults_list.html
<a class="btn btn-primary btn-lg"
href="{% url 'default_new' {{deviceID}} %}" role="button"> Add New Default Parameter</a>
编辑 当我尝试访问defaults_list.html时,我收到“NoReverseMatch at /defaults/41”,但是当我将defaultCreateView的URL更改为:
时,这个问题就解决了 path('new/', defaultCreateView.as_view(), name='default_new'),
def update_project_filter(request):
...
selected_project_id = project_form.cleaned_data["Project_Name"].id
request.session['selected_project_id'] = selected_project_id
...
def update_project(request):
...
selected_project_id = request.session.get('selected_project_id')
...
假设您已激活“django.contrib.sessions.middleware.SessionMiddleware”
我也有同样的问题。我决定将电子邮件传递到“RegisterUserView”中的args,然后在“CodeConfirmationUserView”中在“get_initial”方法中检索该值,该方法从 self.kwargs 获取“电子邮件”,然后将其作为模板传递到我的模板中初始数据。
views.py
class RegisterUser(ConfirmationCodeMixin, ErrorMessageMixin, SuccessMessageMixin, CreateView):
model = get_user_model()
form_class = RegisterUserForm
template_name = 'users/register.html'
extra_context = {'title': 'Registration'}
success_message = "The confirmation code has been successfully sent!"
def form_valid(self, form):
try:
user = form.save(commit=False)
except UserNotInExternalResource as error:
messages.error(request=self.request, message=error)
return redirect(to=reverse_lazy(REGISTER_URL))
# ...
return redirect(to=reverse_lazy('users:code_confirmation', args=(user.email,)))
class CodeConfirmationUser(ConfirmationCodeMixin, ErrorMessageMixin, SuccessMessageMixin, FormView):
model = get_user_model()
form_class = CodeConfirmationUserForm
template_name = 'users/code_confirmation.html'
extra_context = {'title': 'Registration'}
success_url = reverse_lazy('home')
success_message = "Registation and authentication have been successfully permormed!"
def post(self, request, *args, **kwargs):
# ...
def get_initial(self):
initial = super().get_initial()
initial['email'] = self.kwargs.get('email', '') # Set the initial value for the email field
return initial
code_confirmation.html
<div class="my-3">
<label class="w-150 me-2 align-top" for="{{ form.email.id_for_label }}">
{{ form.email.label }}
</label>
{{ form.email }}
</div>
<div class="my-3">
<label class="w-150 me-2 align-top" for="{{ form.confirmation_code.id_for_label }}">
{{ form.confirmation_code.label }}
</label>
{{ form.confirmation_code }}
</div>
urls.py
from django.contrib.auth.views import LogoutView
from django.urls import path
from users import views
app_name = "users"
urlpatterns = [
path('register/', views.RegisterUser.as_view(), name='register'),
path('code_confirmation/<str:email>', views.CodeConfirmationUser.as_view(), name='code_confirmation')
]
现在将显示电子邮件的默认值