Создание обновления или создание вида формы в Django - PullRequest
0 голосов
/ 21 января 2019

У меня есть модель с именем profile, и она имеет отношение один к одному с моделью User. profile содержит ненужную информацию о пользователе, такую ​​как биография, пол, страна и т. Д. Поэтому, когда пользователь регистрируется, у него еще не будет профиля. Когда пользователь войдет в настройки и начнет вводить данные, у него будет профиль.

При этом, как мне создать представление в Django, которое может как создавать подробности профиля пользователя, так и обновлять существующую информацию.

форма

class ProfileForm(ModelForm):
    class Meta:
        model = Profile
        fields = ['avatar', 'bio', 'gender', 'dob', 'country']

View

class SettingsView(FormView):
    template_name = 'oauth/settings.html'
    form_class = ProfileForm
    success_url = reverse_lazy('oauth:settings')
    redirect_field_name = "next"

1 Ответ

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

Попробуйте:

from django.views import View
from .forms import ProfileForm
from .models import Profile

class Settings(View):
   form_class = ProfileForm
   template_name = 'oauth/settings.html'

   def post(self, request):
      form = self.form_class(request.POST)
      data = {'error':''}
      if form.is_valid():
          user = request.user
          bio = form.cleaned_data['bio']
          # more fields here
          try:
             profile = user.profile
             # update user profile
             profile.bio = bio
             # add more fields here
             profile.save()
             data['response'] = 'profile updated!'
          except:
             profile = Profile(user=user,bio=bio) #add more fields
             profile.save()
             data['response'] = 'profile created!'
     else:
        data['error'] = 'Invalid form!'
     return render(request, self.template_name,{'data':data})

Редактировать:

Или мы можем использовать update_or_create(), как предложено ФП в комментариях.

Заменив блоки try и except на:

updated_values = {'bio':bio} # add more fields
obj, created = Profile.objects.update_or_create(user=user,bio=bio, defaults=updated_values) # add more fields
if created:
   data['response'] = 'profile created!'
else:
   data['response'] = 'profile updated!'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...