2017-08-26 2 views
0

J'ai un formulaire dans un projet Django, et je veux que l'utilisateur entre son anniversaire afin que je puisse être sauvegardé dans la base de données et utilisé plus tard dans le projet ...Essayer de permettre à l'utilisateur de sélectionner anniversaire - django

J'ai un modèle et je veux créer un Modelform qui va demander la date et ensuite le formater et l'enregistrer dans la base de données. J'ai essayé de comprendre cela pendant 3 jours et je ne peux pas le faire fonctionner ... J'ai dû supprimer mon fichier de base de données environ 5 fois parce que cela ne fonctionnait pas et la base de données ...

Lorsque l'utilisateur soumet le formulaire, le retour est trois éléments distincts qui comprennent dob_month, dob_day, dob_year avec les informations de date correctes

Voici ce que j'ai jusqu'à présent.

fichier models.py

class Profile(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) # server 
    first_name = models.CharField(max_length=25, default='first') 
    last_name = models.CharField(max_length=25, default='last') 
    dob = models.DateField(auto_now_add=False, blank=True) 
    city = models.CharField(max_length=45) # user 
    state = models.CharField(max_length=25, default='state') 
    phone = models.BigIntegerField(default=0) # user 
    privacy = models.SmallIntegerField(default=1) # user 
    created = models.DateTimeField(auto_now_add=True) # server 

Voici le fichier forms.py:

class ProfileForm(forms.ModelForm): 
    split_choices = (('1', 'public'), 
        ('2', 'private')) 
    privacy = forms.TypedChoiceField(
     choices=split_choices, widget=forms.RadioSelect, coerce=int 
    ) 
    dob = forms.DateField(widget=extras.SelectDateWidget) 
    class Meta: 
     model = Profile 
     fields = ['first_name', 'last_name', 'dob', 'city', 'state', 'phone', 'privacy'] 

est ici le fichier view.py (la définition spécifique qui traite la forme ...)

def profile_setup(request): 
    if 'username' not in request.session: 
     return redirect('login') 
    else: 
     # the following is just going to grab the currently logged in user and 
     # save the profile information to the appropriate user 
     username = request.session['username'] 
     currentUser = User.objects.get(username = username) 
     # the following is the provessing for the form where the user entered 
     # the profile informaiton 
     if request.method == 'POST': 
      form = ProfileForm(request.POST) 
      if form.is_valid(): 
       cd = form.cleaned_data 
       first_name = cd['first_name'] 
       last_name = cd['last_name'] 
       dob_month = form.cleaned_data.get("dob_month") 
       dob_day = form.cleaned_data.get("dob_day") 
       dob_year = form.cleaned_data.get("dob_year") 
       city = cd['city'] 
       state = cd['state'] 
       phone = cd['phone'] 
       privacy = cd['privacy'] 
       # this is the new record that is going to be created and saved 
       new_profile = Profile.objects.create(
        user = currentUser, 
        first_name = first_name, 
        last_name = last_name, 
        dob_month = dob_month, 
        dob_day = dob_day, 
        dob_year = dob_year, 
        city = city, 
        state = state, 
        phone = phone, 
        privacy = privacy, 
       ) 
       return redirect('home_page') 
     else: 
      # this is what is going to be saved into the html file and used to 
      # render the file 
      form = ProfileForm() 
      message = 'fill out form below' 
      parameters = { 
       'form':form, 
       'currentUser':currentUser, 
       'message':message, 
      } 
      return render(request, 'tabs/profile_setup.html', parameters) 

** MISE À JOUR SECTION **

permet donc dire que j'avoir un modèle comme les suivants:

class Group(models.Model): 
    name = models.CharField(max_length = 25) 
    description = models.CharField(max_length = 250, null=True) 
    count = models.SmallIntegerField(default=1) 
    status = models.SmallIntegerField(choices=GROUP_STATUS_CHOICES, default=1) 
    reference_code = models.IntegerField(default=0) 

Andi ont une forme de modèle comme ce qui suit:

class CreateGroupForm(forms.ModelForm): 
    class Meta: 
     model = Group 
     fields = ['name', 'count', 'description'] 

et l'utilisateur soumet le formulaire suivant:

name : omar jandali 
count : 5 
description : random group 

alors je peux traiter le formulaire de la façon suivante:

form = CreateGroupForm(request.POST, instance=new_group) 
new_group = Group(
    name = name, 
    description = desciption, 
    count = count, 
    status = status, 
) 

ou devrais-je encore affecter les données nettoyées ....

Répondre

1

Vous n'avez pas besoin de faire autant de travail pour traiter le formulaire. Avec les formes de modèles Django, la plupart du travail est fait pour vous. Si vous voulez créer un nouvel enregistrement assurez-vous que vous ajoutez à votre instance balise form comme ceci:

form = ProfileForm(request.POST, instance= new_profile) 

Puis avant method.request ajouter:

new_profile = Profile(
    user = ... 
    created = ... 
    ) 

où « ... » est la valeur vous voulez être associé à cette instance de formulaire.

se débarrasser de new_profile = Profile.objects.create(...

Fondamentalement, vous devez définir les valeurs qui ne sont pas fournies par l'utilisateur dans l'instance spécifique puis les appeler lorsque vous instancier le formulaire.

+0

Donc, pour n'importe quelle forme de modèle, je peux juste créer une instance de celui-ci et l'enregistrer sans avoir à le traiter comme je le fais en ce moment .... pouvez-vous regarder la section mise à jour de mon article quelque chose comme ça pour l'une de mes formes [email protected] –

+0

Étant donné que vous utilisez un modèle avec des champs pour le nom, la description et le nombre, il n'est pas nécessaire d'ajouter le nom, la description et le nombre au nouveau groupe. Vous avez juste besoin de valeurs pour status et reference_code. Assurez-vous également que votre balise de formulaire ne vient pas après votre nouveau_group ou qu'elle ne fonctionnera pas. – jonin