0

Ich möchte zulassen, dass Benutzer nur ihr Profil bearbeiten. Dies ist meine URL:Django --- Zulassen, dass Benutzer nur ihr Profil bearbeiten können

url(r'^profile/(?P<pk>[0-9]+)/$', views.UserUpdate.as_view(), name='profile') 

Nun, wenn der Benutzer, klicken Sie auf ‚Mein Profil‘ sie ihr eigenes Profil bekommen, die sie bearbeiten können, aber wenn sie manuell den URLPath in Browser bearbeiten und andere Benutzer-ID eingeben, wie unten, sie können andere Benutzer-Profile anzeigen und bearbeiten

http://127.0.0.1:8000/profile/1/ 

das ist meine Ansicht

class UserUpdate(UpdateView): 
model = Profile 
fields = ['personal_info','job_title','department', 'location','expertise', 'user_photo','phone_number','contact_facebook','contact_linkedin','contact_skype'] 
template_name = 'user_form.html' 
success_url = reverse_lazy('index') 

Jetzt in user_form.html ich überprüft haben, ob der Benutzer authentifiziert ist, so dass vie können nur angemeldete Benutzer w die Profilseite, aber immer noch angemeldet Benutzer kann das Profil eines anderen Benutzers sehen.

{% if user.is_authenticated %} 
        <h3> {{ user.first_name }}'s Profile</h3> 
        <form class="form-horizontal" action="" method="post" enctype="multipart/form-data"> 
        {% csrf_token %} 
        {% include 'form-template.html' %} 
        <div class="form-group"> 
         <div class="col-sm-offset-2 col-sm-10"> 
          <button type = "submit" class="btn btn-success">Submit</button> 
          <a href={% url 'index' %}><input type="button" class = " col-sm-offset-2 btn btn-warning " name="cancel" value="Cancel" /></a> 
         </div> 
        </div> 
        </form> 

Das ist mein Modell:

class Profile(models.Model): 
user = models.OneToOneField(User, on_delete=models.CASCADE) 
personal_info = models.TextField(blank=True) 
job_title = models.CharField(max_length=100, blank=True) 
department = models.CharField(max_length=100, blank=True) 
location = models.CharField(max_length=100, blank=True) 
expertise = models.TextField(blank=True) 
phone_regex = RegexValidator(regex=r'^\+?1?\d{5,15}$', message="Phone number must be entered in the format: '+123456'. Between 5 and 15 digits allowed.") 
phone_number = models.CharField(validators=[phone_regex], max_length=16, blank=True) 
contact_skype = models.URLField(null=True, blank=True) 
contact_facebook = models.URLField(null=True, blank=True) 
contact_linkedin = models.URLField(null=True, blank=True) 
user_photo = models.ImageField(upload_to='../media/img', blank=True) 

@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile.objects.create(user=instance) 
    instance.profile.save() 

@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.profile.save() 

Wie kann ich angemeldeten Benutzer beschränken, um nur ihr Profil zu bearbeiten? Ich weiß, dass es viele ähnliche Fragen und mögliche doppelte Überlauf im Stapel gibt, aber keine schien mir meinen Fall zu helfen.

Vielen Dank im Voraus

Antwort

1

Sie können wie so

url(r'^profile/$', views.UserUpdate.as_view(), name='profile') 

Und dann holen die pk aus Ihrer URL einfach entfernen nur das Profil des Benutzers

class UserUpdate(UpdateView): 
    model = Profile 
    fields = ['personal_info','job_title','department', 'location','expertise', 'user_photo','phone_number','contact_facebook','contact_linkedin','contact_skype'] 
    template_name = 'user_form.html' 
    success_url = reverse_lazy('index') 

    def get_object(self): 
     return self.request.user.profile 

diese Weise können Sie sicherstellen, dass die Die Profilansicht wird immer nur mit dem eigenen Profil des Benutzers geladen.

Als zusätzliche Anmerkung möchten Sie möglicherweise die Ansicht einschränken, damit nur eingeloggte Benutzer zugelassen werden.

+0

@dan_kaufhold, aber dies füllt das Profilformular nicht mit aktuellen Daten. Ich will Felder mit ihren aktuellen Werten gefüllt werden – Uttam

+1

@Alasdair danke! Die Antwort wurde aktualisiert. –

+0

@ user3612693 Wenn Sie dies verwenden, enthält die Vorlage die Variable '{{Objekt}}', die Sie für Felder des Profils referenzieren können, und die Variable '{{Formular}}', um ein Formular mit allen von Ihnen definierten Feldern zu rendern. Sie haben dann die Anfangswerte der geladenen Objekte. –

Verwandte Themen