Automatyczne przypisywanie stworzonego obiektu pod aktualnie zalogowanego uzytkownika

Odpowiedz Nowy wątek
2017-06-02 00:54
0

Witam,
Próbowałem i próbowałem i nic ... Może ktoś będzie w stanie mi pomóc to zrobić.
Mianowicie mam model Druzyna:

class Druzyna(models.Model):
    user = models.ForeignKey(User, default=1)
    nazwa = models.CharField(max_length=100)
    akceptacja = models.CharField(max_length=3, default='no')
    punkty = models.CharField(max_length=3, default='no')

    def get_absolute_url(self):
        return reverse('druzyny:detail', kwargs={'pk': self.pk})

    def __str__(self):
        return self.nazwa

Tworzenie owej drużyny:

class DruzynaCreate(CreateView):
    model = Druzyna
    fields = ['user', 'nazwa']

druzyna_form.html:

{% extends user.is_authenticated|yesno:"druzyny/base.html,druzyny/base_visitor.html" %}
{% block body %}
{% if user.is_authenticated %}
<div id="contentNewTeam">
    <h1>Dodawanie nowej drużyny:</h1>
    <div class ="row">

        <form class="form-horizontal" action="" method="post" enctype="multipart/form-data">
            {% csrf_token %}
            {% include 'druzyny/form-template.html' %}
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button type="submit" class="btn btn success">Zatwierdz</button>
                </div>
            </div>

        </form>

    </div>

</div>
{% else %}
    <h3>Do przegladania tej strony wymagane jest zalogowanie.</h3>
    <h3>Nie masz jeszcze konta? <a href="{% url 'druzyny:register' %}">Kliknij tutaj</a> aby sie zarejestrowac.</h3>
    <h3>Posiadasz juz konto? <a href="{% url 'druzyny:login_user' %}">Kliknij tutaj</a> aby sie zalogowac.</h3>
{% endif %}
{% endblock %}

form-template.html:

{% for field in form %}

    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <span class="text-danger small">{{field.errors}} </span>
        </div>
        <label class="control-label col-sm-2">{{field.label_tag}}</label>   <!--bierze wartosc z pola klasy-->
        <div class="col-sm-10">{{field}}  </div>    <!--input area-->
    </div>

{% endfor %}

Cały problem polega na tym, że gdy się zaloguję to dodawanie drużyny wygląda tak jak w załączniku nr 1.
Problem tkwi w tym, że pola są generowane automatycznie, czy istnieje możliwość jakoś podpięcia tego aktualnie zalogowanego użytkownika z automatu?
Kombinowałem z auth.User, kombinowałem z ukryciem pola, kombinowałem z settings.auth_user_model, ale nie wychodzi, tak już siedzę pare dni nad tym problemem i nie mogę go rozwiązać.
Czy może jakośda się w tym form-template.html odwołać, że jeżeli natrafi na pole "user" to jakoś aktualnie zalogowaną osobę automatycznie przyporządkuje?

  • 1.png (0,22 MB) - ściągnięć: 62
edytowany 1x, ostatnio: Blue_Carpet, 2017-06-02 01:04

Pozostało 580 znaków

2017-06-02 10:12
1

Jeśli dobrze rozumiem co chcemy osiągnąć:

class DruzynaCreate(CreateView):
    model = Druzyna
    fields = ['nazwa']

    def form_valid(self, form):
        """
        If the form is valid, save the associated model.
        """
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return super(DruzynaCreate, self).form_valid(form)

Teraz będziesz miał sam formularz z jednym polem nazwa, a przed zapisaniem formularza będziesz automatycznie dodawał usera. Daj znać czy jest ok.

edytowany 1x, ostatnio: Rado95, 2017-06-02 10:14
@Rado95 Wielkie wielkie dzięki, jest to mój pierwszy projekt w Django i naprawde bardzo duzo czasu poswiecilem próbując rozwiązać ten problem, zaproponowane przez Ciebie rozwiązanie działa jak należy, aż nie dowierzałem, że zadziała. Kombinowałem bardzo długo nawet jakos próbowałem w form-template.html tzn. wychwytywałem pole gdzie field == 'user' i probowalem tam jakos wrzucic aktualnie zalogowanego uzytkownika ale nie udawlo sie ; /. Jeszcze raz dzięki ! - Blue_Carpet 2017-06-02 14:26
Może już używasz ,a może nie więc łap https://ccbv.co.uk/ powinno Ci ułatwić pracę z CBV. - Rado95 2017-06-02 19:21

Pozostało 580 znaków

2017-06-02 15:01
0

Mam jeszcze jedno pytanie odnośnie podobnej sytuacji. Po dodaniu i przypisaniu druzyny dla uzytkownika (zakladam ze jeden uzytkownik moze posiadac tylko jedna druzyne, sproboje zrobic jakies ograniczenie) - chcialbym aby dodawany zawodnik do druzyny byl przyporządkowywany właśnie do tej druzyny ktora zostala stworzona. Tak jakby: loguje na usera, user ma druzyne i chce dodac teraz do tej druzyny zawodnika i tutaj aktualnie mam podobno sytuacje, ze z listy wszystkich druzyn wybieram druzyne, potem wpisuje imie i nazwisko zawodnika ktorego chce dodac, a chcialbym, aby ten wybor druzyny do ktorej dodaje zawodnika byl z automatu (zeby wybieralo druzyne, ktora jest przypisana dla aktualnie zalogowanego usera), probowalem zmodyfikowac def napisany wyzej i przeksztalcic na przyporzadkowywanie druzyny, ale nie wychodzi. Ogolnie w indeksie dla zalogowanych uzytkownikow (.html) potrafie wypisac druzyne przypisana dla zalogowanego uzytkownika tzn. przechodze przez wszystkie druzyny i o ile dany uzytkownik posiada druzyne to ją wychwytuje i wypisuej nazwe, ale w tym dodawniu do druzyny zawodnika nie wiem jak to zrobic ; /
model zawodnika:

class Zawodnik(models.Model):
    druzyna = models.ForeignKey(Druzyna, on_delete=models.CASCADE)
    imie = models.CharField(max_length=40)
    nazwisko = models.CharField(max_length=40)
    gole = models.CharField(max_length=3, default='0')

    def get_absolute_url(self):
        return "/druzyny/zawodnik/add/"

    def __str__(self):
        return self.imie + ' ' + self.nazwisko

Views.py:

class ZawodnikCreate(CreateView):
    model = Zawodnik
    fields = ['druzyna', 'imie', 'nazwisko']

@edit
Uporałem się z tym, wykorzystałem ten def z DruzynaCreate. Pod zmienną pobieram listę drużyn danego użytkownika (zawsze będzie jeden element na liście), a następnie przypisuje pod self.object.druzyna pierwszy element z listy. Śmiga ładnie.

W załączniku nr 2 przesyłam zdjęcie jak to aktualnie wygląda.

  • 2.png (0,31 MB) - ściągnięć: 50
edytowany 1x, ostatnio: Blue_Carpet, 2017-06-02 17:48

Pozostało 580 znaków

2017-06-03 12:45
0

Jeszcze mam jedno pytanie może ktos bd wiedział.
@Rado95
Chodzi o to, że jak sobie zaloguje na usera - jezeli nie ma druzyn to ma opcje "Dodaj druzyne", jezeli posiada druzyne to nie ma tej opcji. Klikam Dodaj druzyne i potem chcialbym zwrocic jeszcze listę druzyn jakie posiada. Aktualnie widok wyglada tak:

class DruzynaCreate(CreateView):
    model = Druzyna
    fields = ['nazwa']

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return super(DruzynaCreate, self).form_valid(form)

A chcialbym jeszcze zeby zwrocilo jego druzyny, cos kombinowalem zeby wcisnąć w kod:

druzyny = Druzyna.objects.filter(user=request.user)

i jakos to dodac do returna

{'druzyny': druzyny}

ale nie wychodzi
@edit
Wlasnie jak moge dodac do tego super i ogolnie do innych returnow, zeby mi kiedy chce zwracalo tez liste wszystkich druzyn bo wymyslilem tak ze: jezeli user posiada jakies druzyny to nie pojawi mu się opcja "Dodaj Druzyne" jezeli user nie posiada druzyny to nie pojawi mu sie opcja "Dodaj zawodnika"
i takiego ifa w menu robie:

{% if druzyny %}
{% else %}
<li class="">
                    <a href="{% url 'druzyny:druzyna-add' %}">Dodaj drużynę</a>
</li>
{% endif %}

podobna sytuacja dla opcji "Dodaj zawodnika" tylko na odwrot, ale nie wiem jak dodac zwracanie druzyn uzytkownika do tego returna np. w klasie DruzynaCreate, ZawodnikCreate i ogolnie w innych niektorych tez bym chcial

edytowany 2x, ostatnio: Blue_Carpet, 2017-06-03 14:09

Pozostało 580 znaków

2017-06-03 14:36

Na razie możesz zrobić to tak, ale sam nie jestem pewien czy to poprawne rozwiązanie

    def get_context_data(self, **kwargs):
        """
        Insert the single object into the context dict.
        """
        context = {}
        context['druzyna'] = Druzyna.objects.filter(user=self.request.user)
        return super(DruzynaCreate, self).get_context_data(**context)

W template

{% for x in druzyna %}
      {{ x.nazwa }}
{% endfor %}
edytowany 1x, ostatnio: Rado95, 2017-06-03 14:36

Pozostało 580 znaków

2017-06-03 22:51
0

@Rado95 Spoko dzięki
@edit naprawione

edytowany 1x, ostatnio: Blue_Carpet, 2017-06-03 23:16

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0