Как я могу контролировать то, что аутентифицированные пользователи могут видеть в Django? - PullRequest
0 голосов
/ 16 апреля 2019

Попытка скрыть представление для создания ресторана от кого-либо, кроме владельца ресторана.

Использованы примеры, показанные с использованием групп и проверки, находится ли пользователь в этой группе или нет, но, похоже, ничего не работает.

views.py

def is_owner(user):
    if user.objects.filter(name="Owner").exists():
        return True

class CreateRestaurantView(generic.CreateView):
    form_class = CreateRestaurantForm
    success_url = reverse_lazy('home')
    template_name = 'signup.html'

@login_required
def create_restaurant(request):
    if is_owner == True:
        if request.method == "POST":
            form = CreateRestaurantForm(request.POST)
            if form.is_valid():
                restaurant = form.save(commit=False)
                restaurant.Restaurant_Owner = request.user
                restaurant.save()
                return redirect('restaurant_list')
        else:
            form = CreateRestaurantForm()
        return render(request, 'create_restaurant.html', {'form': form})
    else:
        return render(request, 'home.html')

forms.py

регистрационная форма для владельцев

class OwnerCreationForm(forms.ModelForm):
    error_messages = {
        'password_mismatch': _("The two password fields didn't match."),
    }
    password1 = forms.CharField(label=_("Password"),
        widget=forms.PasswordInput)
    password2 = forms.CharField(label=_("Password confirmation"),
        widget=forms.PasswordInput,
        help_text=_("Enter the same password as above, for verification."))

    class Meta:
        model = User
        fields = ("username",)

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError(
                self.error_messages['password_mismatch'],
                code='password_mismatch',
            )
        return password2

    def save(self, commit=True):
        user = super(OwnerCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])

        if commit:
            user.save()
            group = Group.objects.get(name='Owner')
            user.groups.add(group)

        return user

Я пытаюсь показать видформа create_restaurant, когда пользователь принадлежит к группе «Владелец», но функция для тестирования (is_owner) не работает и всегда ложна.

1 Ответ

1 голос
/ 16 апреля 2019

Прежде всего, вы определены is_owner как функция , поэтому вы должны назвать ее как is_owner(any_user_object)

Во-вторых, для поиска по Group это должно быть как

user.groups.filter(name="Owner").exists()

фрагмент кода

def is_owner(user):
    <b>return user.groups.filter(name="Owner").exists()</b>


@login_required
def create_restaurant(request):
    <b>if is_owner(request.user) == True:</b>
        if request.method == "POST":
            form = CreateRestaurantForm(request.POST)
            if form.is_valid():
                restaurant = form.save(commit=False)
                restaurant.Restaurant_Owner = request.user
                restaurant.save()
                return redirect('restaurant_list')
        else:
            form = CreateRestaurantForm()
        return render(request, 'create_restaurant.html', {'form': form})
    else:
        return render(request, 'home.html')

UPDATE-1

изменить save() метод OwnerCreationForm, как показано ниже

class OwnerCreationForm(forms.ModelForm):
    # your other code

    <b>def save(self, commit=True):
        user = super(OwnerCreationForm, self).save(commit=True)
        user.set_password(self.cleaned_data["password1"])
        if not user.groups.filter(name="Owner").exists():
            group = Group.objects.get(name='Owner')
            user.groups.add(group)
        user.save()
        return user</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...