Отношения Django ManyToMany с ошибкой ModelMultipleChoice - PullRequest
0 голосов
/ 11 января 2019

Я довольно новичок в Джанго. Поэтому мы пытаемся использовать встроенные функции вместо переопределения функций. Я установил отношения ManyToMany между пользователем и сервисом.

Означает, что у пользователя может быть много услуг, а услуга может быть получена многими пользователями. (Не уверен, что я прав)

Ниже приведены мои модели

Userdata

from django.db import models
from django.contrib.auth.models import User
from services.models import Services

class Userdata(models.Model):
    username=models.OneToOneField(User,on_delete=models.CASCADE)
    tel=models.CharField(max_length=10,unique=True)
    address=models.CharField(max_length=100,null=True,blank=True)
    city=models.CharField(max_length=10,null=True,blank=True)
    zipcode=models.CharField(max_length=6,null=True,blank=True)
    services=models.ManyToManyField(Services,through='dashuser.UpcomingUserServices')

Услуга

from django.db import models

class Services(models.Model):
    sname=models.CharField(max_length=20)
    scost=models.IntegerField()

    def __str__(self):
        return self.sname

UpcomingUserService

from django.db import models
from services.models import Services
from log.models import Userdata

class UpcomingUserServices(models.Model):
    userdata=models.ForeignKey(Userdata,on_delete=models.CASCADE)
    service=models.ForeignKey(Services,on_delete=models.CASCADE)
    name=models.CharField(max_length=20)
    phone=models.CharField(max_length=10)
    date=models.DateField()
    address=models.CharField(max_length=100)
    zipcode=models.IntegerField()
    remarks=models.CharField(max_length=100,null=True,blank=True)

ServiceForm

from django import forms
from .models import UpcomingUserServices

class ServiceForm(forms.ModelForm):
    service=forms.ModelMultipleChoiceField(Services.objects.all(),widget=forms.CheckboxSelectMultiple())

    class Meta:
        model=UpcomingUserServices
        exclude=['userdata']

вид

def book(request):
    if request.method=='POST':
        serlist=[]
        f=ServiceForm(request.POST)
        if f.is_valid():
            s=f.save(commit=False)
            u=request.user
            u1=Userdata.objects.get(username_id=u.id)
            s.userdata_id=u1.id
            f.save()
            f.save_m2m()
            return HttpResponse('Done')
        else:
            return render(request,'ns.html',{'f':f})
    else:
        u=request.user
        u1=Userdata.objects.get(username_id=u.id)
        i={
            'name':u.first_name+" "+u.last_name,
            'phone':u1.tel,
            'email':u.email,
            'address':u1.address,
            'zipcode':u1.zipcode
        }
        f = ServiceForm(initial=i)
        return render(request,'ns.html',{'f':f})
# ns.html is where the form is rendered

Когда форма отправлена, я получаю следующую ошибку

ValueError at /user/book
Cannot assign "<QuerySet [<Services: Lawn Mowing>, <Services: Lawn Fertilization>]>": "UpcomingUserServices.service" must be a "Services" instance

(/ user / book - это URL-адрес просмотра)

TrackBack:

Traceback:

File "F:\My Projects\login\venv\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "F:\My Projects\login\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "F:\My Projects\login\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "F:\My Projects\login\venv\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  21.                 return view_func(request, *args, **kwargs)

File "F:\My Projects\login\dashuser\views.py" in book
  63.         if f.is_valid():

File "F:\My Projects\login\venv\lib\site-packages\django\forms\forms.py" in is_valid
  185.         return self.is_bound and not self.errors

File "F:\My Projects\login\venv\lib\site-packages\django\forms\forms.py" in errors
  180.             self.full_clean()

File "F:\My Projects\login\venv\lib\site-packages\django\forms\forms.py" in full_clean
  383.         self._post_clean()

File "F:\My Projects\login\venv\lib\site-packages\django\forms\models.py" in _post_clean
  398.             self.instance = construct_instance(self, self.instance, opts.fields, opts.exclude)

File "F:\My Projects\login\venv\lib\site-packages\django\forms\models.py" in construct_instance
  60.             f.save_form_data(instance, cleaned_data[f.name])

File "F:\My Projects\login\venv\lib\site-packages\django\db\models\fields\__init__.py" in save_form_data
  854.         setattr(instance, self.name, data)

File "F:\My Projects\login\venv\lib\site-packages\django\db\models\fields\related_descriptors.py" in __set__
  210.                     self.field.remote_field.model._meta.object_name,

Exception Type: ValueError at /user/book
Exception Value: Cannot assign "<QuerySet [<Services: Lawn Mowing>, <Services: Lawn Fertilization>]>": "UpcomingUserServices.service" must be a "Services" instance.

1 Ответ

0 голосов
/ 11 января 2019

Вы используете UpcomingUserServices модель по промежуточной модели. Таким образом, UpcomingUserServices модель должна принимать один user и один service. Но ваш ServiceForm принял несколько услуг по forms.ModelMultipleChoiceField.

Я знаю, что вы пытаетесь реализовать. Но это не правильно.

Вы используете промежуточную таблицу. Так что проверьте посредник много ко многим и аналогичный кейс вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...