R. *_*nes 5 python django bootstrap-4
我有一个名为“Accounts”的 Django 应用程序,它扩展了 Django 默认用户模型。我希望每个用户都能够更新他们的帐户,这是一个使用 generic.UpdateView 的名为 UserProfile 的模型。当我访问 UpdateView URL 时出现以下错误:
BootstrapError at /accounts/user-profile/5/edit/ 参数“form”应包含有效的 Django 表单。
我在下面包含了我的代码。谢谢你!
模型.py
from django.db import models
from django.contrib import auth
# Create your models here.
class User(auth.models.User,auth.models.PermissionsMixin):
readonly_fields = ('id','pk')
def __str__(self):
return self.username
class UserProfile(models.Model):
user = models.OneToOneField(auth.models.User,on_delete=models.CASCADE)
join_date = models.DateTimeField(auto_now=True)
profile_pic = models.ImageField(upload_to='profile_pics',default='media/block-m.png')
skills = models.TextField()
major = models.CharField(max_length=128)
grad_year = models.CharField(max_length=4)
clubs = models.TextField() #make FK to Clubs
opt_in = models.BooleanField(default=True)
def __str__(self):
return self.user.username
Run Code Online (Sandbox Code Playgroud)
表格.py
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from .models import UserProfile
from django import forms
class UserCreateForm(UserCreationForm):
class Meta:
model = get_user_model()
fields = ('first_name','last_name','username','email','password1','password2')
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
# self.fields['username'].label = 'Username'
# self.fields['email'].label = 'Email Address'
# self.fields['password1'].label = 'Password'
# self.fields['password2'].label = 'Confirm Password'
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ('profile_pic','grad_year','opt_in')
Run Code Online (Sandbox Code Playgroud)
视图.py
from django.shortcuts import render,redirect
from django.contrib import messages
from django.contrib.auth.mixins import(
LoginRequiredMixin,
PermissionRequiredMixin
)
from django.urls import reverse,reverse_lazy
from django.db import IntegrityError
from django.shortcuts import get_object_or_404
from django.views import generic
from .models import User,UserProfile
from .forms import UserCreateForm,UserProfileForm
import easygui
from . import models
from . import forms
# Create your views here.
class ListAccounts(generic.ListView):
model = models.UserProfile
class DetailAccounts(generic.DetailView):
model = models.UserProfile
class UpdateAccounts(generic.UpdateView):
fields = ('grad_year',)
model = models.UserProfile
def SignUp(request):
registered=False
if request.method == "POST":
user_create_form = UserCreateForm(data=request.POST)
user_profile_form = UserProfileForm(data=request.POST)
if user_create_form.is_valid() and user_profile_form.is_valid():
user = user_create_form.save()
user_profile = user_profile_form.save(commit=False)
user_profile.user = user
if 'profile_pic' in request.FILES:
user_profile.profile_pic = request.FILES['profile_pic']
user_profile.save()
registered = True
return redirect('/accounts/login/')
else:
print(user_create_form.errors,user_profile_form.errors)
else:
user_create_form = UserCreateForm()
user_profile_form = UserProfileForm()
return render(request,'accounts/signup.html',
{'user_create_form':user_create_form,
'user_profile_form':user_profile_form,
'registered':registered})
Run Code Online (Sandbox Code Playgroud)
urls.py
from django.contrib.auth import views as auth_views
from . import views
app_name = 'accounts'
urlpatterns = [
path('login/',auth_views.LoginView.as_view(template_name='accounts/login.html'),name='login'),
path('logout',auth_views.LogoutView.as_view(),name='logout'),
path('',views.ListAccounts.as_view(),name='all'),
path('signup/',views.SignUp,name='signup'),
path('user-profile/<int:pk>/',views.DetailAccounts.as_view(),name='detail'),
path('user-profile/<int:pk>/edit/',views.UpdateAccounts.as_view(),name='user_update'),
path('match/',views.Match.as_view(),name='match'),
]
Run Code Online (Sandbox Code Playgroud)
用户个人资料_表单.html
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
<div class="container login">
<h2>Update</h2>
<form action="{% url 'accounts:all' %}" enctype="multipart/form-data" method="POST">
{% csrf_token %}
{% bootstrap_form user_profile_form layout='inline' %}
<input type="submit" class="btn" style="background:#f86041; color:white;" value="Update">
</form>
</div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
我将尝试解释我尝试解决此问题所采取的步骤,以便您可以更好地了解如何自行解决该问题:
首先,您需要了解为什么会引发错误。这不是BootstrapError标准错误,因此您需要查看源代码以django-bootstrap4了解引发该错误的原因。查看源代码(只需搜索)你会发现:
if not isinstance(form, BaseForm):
raise BootstrapError('Parameter "form" should contain a valid Django Form.')
Run Code Online (Sandbox Code Playgroud)
尝试从调用模板标记的位置到引发此错误的位置(查看回溯也可能对您有所帮助)来完成代码,以了解所有各种变量的含义。
在您的情况下form将等于user_profile_form,并且会引发错误,因为user_profile_form不是BaseForm(从 导入django.forms.forms)的实例。所以你可以回去看看user_profile_form。嗯,它是一个实例,UserProfileForm而它又是 的子类ModelForm。但ModelForm是 的子类BaseForm。嗯……这似乎有点奇怪。为什么不是user_profile_form一个BaseForm应该是的例子。
此时,首先检查一下是否有拼写错误之类的?也许检查您的中间件是否可以使用该表单。另外,尝试简化事情,只需渲染表单{{ user_profile_form }}......您会发现这不起作用。那么问题似乎出在user_profile_form?
啊哈...我们已经传递user_profile_form到视图中的模板了SignUp。但这不是我们在这里看到的景色!我们正在考虑的视图就是UpdateAccounts视图。这是一个generic.UpdateView,如果我们查看 django 文档(总是一个好主意)并查看示例,我们会看到表单作为form.
更换线路:
{% bootstrap_form user_profile_form layout='inline' %}
Run Code Online (Sandbox Code Playgroud)
和
{% bootstrap_form form layout='inline' %}
Run Code Online (Sandbox Code Playgroud)
在模板中userprofile_form.html,它应该一切顺利:)
正如你所看到的,在我偶然发现(也许更明显)正确的解决方案之前,我走了一些死胡同。但我希望这会有所帮助。
| 归档时间: |
|
| 查看次数: |
1203 次 |
| 最近记录: |