[英]ModelMultipleChoiceField django and debug mode
我正在嘗試在我的應用程序中實現一個 ModelMultipleChoiceField,就像這樣: 鏈接
model.py
class Services(models.Model):
id = models.AutoField(primary_key=True)
type = models.CharField(max_length=300)
class Professionals_Services(models.Model):
professional = models.ForeignKey(User, on_delete=models.CASCADE)
service = models.ForeignKey(Services, on_delete=models.CASCADE)
表單.py
class ProfileServicesUpdateForm(forms.ModelForm):
service = forms.ModelMultipleChoiceField(required=False, queryset=Services.objects.all())
class Meta:
model = Professionals_Services
fields = ['service']
def clean(self):
# this condition only if the POST data is cleaned, right?
cleaned_data = super(ProfileServicesUpdateForm, self).clean()
print(cleaned_data.get('service'))
查看.py
class EditProfileServicesView(CreateView):
model = Professionals_Services
form_class = ProfileServicesUpdateForm
context_object_name = 'services'
template_name = 'accounts/edit-profile.html'
@method_decorator(login_required(login_url=reverse_lazy('professionals:login')))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(self.request, *args, **kwargs)
def post(self, request, *args, **kwargs):
form = self.form_class(data=request.POST)
if form.is_valid():
services = form.save(commit=False)
services.save()
html
<select class="ui search fluid dropdown" multiple="" name="service" id="id_service">
{% for service in services_list %}
<option value="{{ service.id }}">{{ service.type }}</option>
{% endfor %}
</select>
對於開發,我使用 Pycham Professionals(最新版本)和 docker,當我運行應用程序並嘗試進行 POST 時,答案是:
Cannot assign "<QuerySet [<Services: Services object (2)>, <Services: Services object (5)>, <Services: Services object (6)>, <Services: Services object (7)>]>": "Professionals_Services.service" must be a "Services" instance.
但是如果我在調試模式下運行應用程序並在if form.is_valid():
應用程序工作正常
那是因為 validate 等於 Unknown not in debug
你知道怎么修嗎?
您的service
是ForeignKey
:
service = models.ForeignKey(Services, on_delete=models.CASCADE)
ForeignKey
意味着您 select一個元素,而不是多個元素。 您使用ManyToManyField
[Django-doc]來 select 多個元素:
class Professionals_Services(models.Model):
professional = models.ForeignKey(User, on_delete=models.CASCADE)
service = models.ManyToManyField(Service)
您也不應該重寫post
方法,您可以使用LoginRequiredMixin
[Django-doc]來確保用戶已登錄:
from django.contrib.auth.mixins import LoginRequiredMixin
class EditProfileServicesView(LoginRequiredMixin, CreateView):
login_url = reverse_lazy('professionals:login')
model = Professionals_Services
form_class = ProfileServicesUpdateForm
context_object_name = 'services'
template_name = 'accounts/edit-profile.html'
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
在您的Form
中,您還應該返回清理后的數據:
class ProfileServicesUpdateForm(forms.ModelForm):
service = forms.ModelMultipleChoiceField(required=False, queryset=Services.objects.all())
class Meta:
model = Professionals_Services
fields = ['service']
def clean(self):
# this condition only if the POST data is cleaned, right?
cleaned_data = super(ProfileServicesUpdateForm, self).clean()
print(cleaned_data.get('service'))
return cleaned_data
注意:通常最好使用
settings.AUTH_USER_MODEL
[Django-doc]來引用用戶 model,而不是直接使用User
model [Django-doc] 。 有關詳細信息,您可以參閱文檔中引用User
model的部分。
注意:Django 中的模型是用PerlCase而不是snake_case編寫的,因此您可能希望將 model 從
重命名為Professionals_Services
ProfessionalService
。
注意:通常 Django model 被賦予一個單數名稱,因此
Services
而不是。Service
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.