簡體   English   中英

ModelMultipleChoiceField django 和調試模式

[英]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

你知道怎么修嗎?

您的serviceForeignKey

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM