Как я могу разрешить пользователям редактировать свои профили в Django? - PullRequest
2 голосов
/ 14 июля 2020

У меня есть такая модель в models.py:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.DO_NOTHING)
    phone_number = models.CharField(max_length=50, default='')
    Birthday = models.CharField(max_length=50, default='')
    city = models.CharField(max_length=50, default='')
    school = models.CharField(max_length=100, default='')
    course = models.CharField(max_length=50, default='')

Я хочу разрешить моим пользователям вносить изменения, поэтому я сделал такую ​​функцию в моих views.py:

    if request.method == 'POST':
        profil = UserProfile.objects.get(user=request.user)
        profil.phone_number = models.CharField(max_length=50, default='')
        profil.Birthday = models.CharField(max_length=50, default='')
        profil.city = models.CharField(max_length=50, default='')
        profil.school = models.CharField(max_length=100, default='')
        profil.course = models.CharField(max_length=50, default='')
        
        profil.save()
        
        return redirect('profile')  
 
    return render(request, 'edit_profile.html')

Мой шаблон:

<form action="." method="post">
        {% csrf_token %}    
        Phone Number:
        <input type="text" name="phone_number" value="{{  profil.phone_number }}" /><br />
        Birthday:
        <input type="text" name="Birthday" value="{{  profil.Birthday }}" /><br />
    
        city:
        <input type="text" name="city" value="{{  profil.city }}" /><br />
        school:
        <input type="text" name="school" value="{{  profil.school }}" /><br />
    
        course:
        <input type="text" name="course" value="{{  profil.course }}" /><br />
       
        <input type="submit" value="Save Changes" name="save" />
        <input type="reset" value="Cancel" name="cancel" />
        <br/>
    </form>

Не знаю почему, но после заполнения формы я получаю сообщение об ошибке: страница не найдена. И если я проверю существующий профиль пользователя, ничего не обновилось. Помогите пожалуйста.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Повторите эти шаги, вам могут потребоваться небольшие изменения:

1. Создайте UserEditForm

в forms.py

from .models import UserProfile
from django.forms import ModelForm

class UserEditForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = '__all__' # or ['phone_number', 'Birthday', 'city', 'only_fields_you_want_to_edit']

2. Создайте представление:

в views.py

from django.shortcuts import render, HttpResponseRedirect, get_object_or_404
from django.urls import reverse
from django.forms.models import model_to_dict
from .models import UserProfile
from .forms import UserEditForm

def userEdit(request, user_id):
    user = get_object_or_404(Question, pk=user_id)
    if request.method == "GET":
        form = UserEditForm(initial=model_to_dict(user))
        return render(request, 'yourapp/useredit_form.html', {'form':form)
    elif request.method == "POST":
        form = UserEditForm(request.POST, instance=user)
        if form.is_valid():
             form.save()
             return HttpResponseRedirect(reverse('user_profile', kwargs={'uid':user.id}))
        else:
             return HttpResponseRedirect(reverse('some_fail_loc'))

3. Создайте шаблон

в yourapp / useredit_form. html

<form method="POST">
    {% csrf_token %}
    {{form}}
    <button type="submit">Submit</button>
</form>

4. Установите URL:

в urls.py

urlpatterns += [
    path('edit_user/<int:user_id>/', views.userEdit, name='user_edit'),
]

Теперь попробуйте посетить yourapp.com/edit_user/1. Вы хорошо go. : D

1 голос
/ 14 июля 2020

у вас есть ошибка

profil = UserProfile.objects.get(user=request.user)
profil.phone_number = models.CharField(max_length=50, default='')

вы получаете объект UserProfile, а затем вместо сохранения str в phone_number вы пытаетесь сохранить объект models.CharField. используйте ModelForm для достижения того, что вам нужно.

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = '__all__'

тогда, по вашему мнению, вы можете использовать:

userprofile_form = UserProfileForm(request.POST if request.POST else None, instance = UserProfile.objects.get(user=request.user))
if request.method == 'POST':
    if form.is_valid():
        form.save()     
        return redirect('profile')  

return render(request, 'edit_profile.html', context={'userprofile_form': userprofile_form)

и в html использовать:

<form action="." method="post">
    {% csrf_token %}    
    Phone Number: {{ userprofile_form.phone_number }}
    Birthday: {{ userprofile_form.Birthday }}
    city: {{ userprofile_form.city }}
    school: {{ userprofile_form.school }}
    course: {{ userprofile_form.course }}           
    <input type="submit" value="Save Changes" name="save" />
    <input type="reset" value="Cancel" name="cancel" />
    <br/>
</form>

или просто

 <form action="." method="post">
     {% csrf_token %}    
     {{ userprofile_form }}           
     <input type="submit" value="Save Changes" name="save" />
     <input type="reset" value="Cancel" name="cancel" />
     <br/>
 </form>

, если вы хотите использовать файлы загрузки, не забудьте поместить свои файлы в форму, вы можете сделать это UserProfileForm(request.POST, request.FILES, instance = UserProfile.objects.get(user=request.user)), а в html вам нужно поставить <form enctype="multipart/form-data" method="post" action="...">

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