2017-05-24 5 views
0

Wenn der Benutzer sein Profil ausfüllen muss, wählt er eine Stadt aus der Google Places Autocomplete und bucht das Formular. In der Ansicht extrahiere ich die Stadt-ID aus der Google API basierend auf dem geposteten Text (ich benutze dieselbe ID wie) pk in meinem db) und versuche, eine Stadt aus meinem db zu extrahieren.Wie kann man ein Django POST Formular abfangen und kontrollieren?

Dies sind die Modelle:

def createprofile(request): 
    if request.method =='POST': 
     user = User.objects.get(username=request.user.username) 
     user_form = UserForm(data=request.POST, instance=user) 

     profile_form = UserProfileForm(data=request.POST) 

     if user_form.is_valid() and profile_form.is_valid(): 
      user = user_form.save() 
      user.save() 

      profile = profile_form.save(commit=False) 

      profile.user = user 

      #brings back the city search result as text 
      searched_city = request.POST['city'] 

      #brings back city ID from the Google API 
      searched_city_id = population_script.get_city_json(searched_city.replace(" ", ""))['results'][0]['id'] 

      #If it's a valid city 
      if searched_city_id != -1: 
       city = City.objects.get(city_id = searched_city_id) 

       profile.city = city#this is what I want to happen! 

      else: 
       return HttpResponse("There's no such city, please try a different query.") 

      if 'prof_pic' in request.FILES:#now save the profile pic 
       profile.prof_pic = request.FILES['prof_pic'] 
       print("PROF PIC IS: " + profile.prof_pic.url) 

      else: 
       profile.prof_pic = 'images/anon.png' 

      profile.save() 

      if 'next' in request.GET: 
       return redirect(request.GET['next']) 

     else: 
      print (user_form.errors, profile_form.errors) 

    else: 
     user_form = UserForm() 
     profile_form = UserProfileForm() 


    return render(request, 
'excurj/createprofile.html', {'user_form':user_form, 'profile_form':profile_form}) 

Allerdings halte ich einen Fehler zu erhalten, dass geschrieben, was wurde Text ist nur während der Stadt eine Stadt sein muss:

class City(models.Model): 
    #extracted from the Google API 
    city_id = models.CharField(primary_key=True, max_length=150) 
    name = models.CharField(max_length=128, blank=True) 
    country = models.CharField(max_length=128, blank=True) 

class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='profile', primary_key=True) 
    city = models.ForeignKey(City, blank=True, null=True) 
    prof_pic = models.ImageField(blank=True, upload_to='profile_pictures') 

Dies ist die Ansicht ist, Objekt. Ich kann das Profilbild aber ok speichern.

Can not assign " 'Dubai - Vereinigte Arabische Emirate'": "UserProfile.city" muss eine "City" Instanz sein.

edit: das sind die Formen:

class UserForm(forms.ModelForm): 
    first_name = forms.CharField(
     label = "First Name:", 
     max_length = 80, 
     required = True 
     ) 

    last_name = forms.CharField(
     label = "Last Name:", 
     max_length = 80, 
     required = True, 
     ) 

    class Meta: 
     model = User 
     fields = ('first_name', 'last_name') 


class UserProfileForm(forms.ModelForm): 
    city = forms.CharField(
     label = "Your Current City:", 
     max_length = 200, 
     required = True, 
     ) 
    class Meta: 
     model = UserProfile 
     fields = ('city','prof_pic', 'dob', 'sex', 'education', 'career', 'about_you', 
      'music_movies_books',) 

Antwort

0

Ich arbeitete um dieses Problem, indem ich ein neues UserProfile-Feld namens city_search_text erstellte, das den gesuchten Text speichert, daher gibt es natürlich keinen Fehler zurück. Ich erhalte es dann in der POST-Anfrage und ziehe bequem die richtige Stadt in die Aussicht.

0

Bitte geben Sie einen related_name zum Stadtfeld in der Userprofile.

+0

@TK Sourab Ich habe versucht, aber es geht durch: 'wenn user_form.is_valid() und profile_form.is_valid():' und erzeugt den obigen Fehler, ich versuchte, die Stadt Zuordnung vor diese Linie ohne Glück. – Seio

+0

Überprüfen Sie Ihre Formulare. –

0

Ich behandelte ein ähnliches Problem durch Überschreiben der sauberen Methode meiner Formulare. So etwas wie die folgenden funktionieren:

def clean(self): 

    # fix city problem 
    if self.cleaned_data.get("city") is not None: 
     self.cleaned_data['city'] = City.objects.get(id=self.cleaned_data.get("city")) 

    return self.cleaned_data 
Verwandte Themen