Django - essaie de faire passer une instance d'un modèle de champ à un champ de formulaire

voix
0

Je vais faire de mon mieux pour ne pas sonner comme un vrai mannequin, mais aucune promesse. Je suis un ambulancier et je suis en train de faire une application à des contrôles de l'unité de documents electronically.I ont un champ de modèle qui est calée étrangère à quelques autres modèles dans mon projet. Ce champ désigne l'unité l'utilisateur d'effectifs pour ce jour-là. Je veux que l'utilisateur de choisir l'unité il / elle dote en personnel ce jour-là et avoir ce remplissage automatique des informations des formulaires remplis pour cette session. J'ai essayé stocker l'objet à l'aide des sessions et je reçois ce « objet de type « MedicUnit » est pas JSON sérialisable ». Je l'ai utilisé la méthode model_to_dict et essayé de passer la chaîne du nom de l'unité par la méthode form_valid mais je reçois ce « ne peut pas affecter « Medic 2 ' »: « DailyCheck.medic_unit_number » doit être un « MedicUnit » par exemple. » Je suis relativement nouveau à la programmation et Django et cela semble être un problème très facile à corriger, mais mes compétences de recherche de Google ne sont pas me faire nulle part. Voici mon code:

Model.py l'origine du champ modèle UNIT_NAME

class MedicUnit(models.Model):
    unit_name = models.CharField(max_length=50, default='')
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return self.unit_name

Model.py pour l'une des principales références étrangères à la UNIT_NAME

class DailyCheck(models.Model):
    daily_user = models.ForeignKey(User, on_delete=models.PROTECT)
    record_date = models.DateTimeField(auto_now=True)
    medic_unit_number = models.ForeignKey('components.MedicUnit', related_name='medic_unit_number', on_delete=models.PROTECT, default='')
    unit_property_number = models.ForeignKey('components.Vehicle', related_name='unit_property_number', on_delete=models.PROTECT, default='')
    mileage = models.IntegerField(default=0)
    narc_seal_number = models.IntegerField(default=0)
    emergency_lights = models.BooleanField()
    driving_lights = models.BooleanField()
    red_bag = models.BooleanField()
    LP_15 = models.BooleanField()
    BLS_bag = models.BooleanField()
    RTF_bag = models.BooleanField()
    suction = models.BooleanField()
    oxygen = models.BooleanField()
    free_text = models.TextField(default='')

views.py pour le modèle directement au-dessus

def check_home_view(request):
    if request.method == 'POST':
        form = ChooseMedicUnit(request.POST or None)
        if form.is_valid():
            unit_name = form.cleaned_data.get('medic_unit_number')
            request.session['unit_name'] = model_to_dict(unit_name)
            print(request.session['unit_name'])
            return redirect('daily')
    else:
        form = ChooseMedicUnit()
    return render(request, 'checks/checks_home.html', {'form':form})

class checkAdd(CreateView):
    model = DailyCheck
    fields = ['unit_property_number', 'mileage', 'narc_seal_number', 'emergency_lights', 'driving_lights', 'red_bag', 'LP_15', 'BLS_bag', 'RTF_bag', 'suction', 'oxygen', 'free_text']
    success_url = '/checks'

    def form_valid(self, form):
        form.instance.daily_user = self.request.user
        form.instance.medic_unit_number = self.request.session['unit_name']['unit_name']
        return super().form_valid(form)

forms.py

class ChooseMedicUnit(forms.ModelForm):
    class Meta:
        model = DailyCheck
        fields = ['medic_unit_number']
Créé 13/02/2020 à 23:53
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Je pense que vous pouvez utiliser MedicUnit.id. Cela devrait être suffisant pour résoudre le problème de l'initialisation du champ de la session sous d'autres formes:

def check_home_view(request):
    if request.method == 'POST':
        form = ChooseMedicUnit(request.POST or None)
        if form.is_valid():
            request.session['unit_name'] = form.cleaned_data.get('medic_unit_number').id  # see here
            print(request.session['unit_name'])
            return redirect('daily')
    else:
        form = ChooseMedicUnit()
    return render(request, 'checks/checks_home.html', {'form':form})
Créé 14/02/2020 à 00:17
source utilisateur

voix
0

Merci beaucoup pour la réponse Andrey. Je vais essayer aussi. Je trouve que tout ce que je devais faire était d'importer le modèle MedicUnit à mon avis et changer ma méthode form_valid à ce qui suit:

def form_valid(self, form):
        form.instance.daily_user = self.request.user
        form.instance.medic_unit_number = MedicUnit.ojbects.get(pk=self.request.session['unit_name']['id'])
        return super().form_valid(form)

Apparemment, les sessions ne peuvent pas stocker des objets car après Django 1.5 je pense. Quelqu'un peut avoir à fait me vérifier. Donc, j'ai parlé une instance de l'objet avec une valeur dictionnaire à partir des données de model_to_dict stockées dans la session avec l'appel MedicUnit.object.get.

Si vous rencontrez le même problème, vous pouvez imprimer les informations de session au terminal avec une déclaration d'impression comme à mon avis de fonction check_home_view. Je Qu'Info pour voir ce que la clé était nécessaire d'appeler le numéro de clé primaire.

Je vérifierai solution Andrey plus tard aujourd'hui et voir comment cela fonctionne. Il semble un peu plus propre que ma solution.

Créé 14/02/2020 à 15:35
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more