Передача данных в форму (из POST и URL) - PullRequest
0 голосов
/ 10 мая 2019

Я не уверен, как передать данные из заданного объекта (профиля) и из формы (request.POST) в одну модель (отношение многие ко многим).

У меня есть две модели: профиль и ключевое слово.Пользователи могут определять много профилей (для разных предметов), и в каждом профиле они могут определять много ключевых слов (используемых позже сканером).Возможно, что одно и то же ключевое слово присутствует во многих профилях, а в одном профиле может быть много ключевых слов.

Теперь у меня есть представление о добавлении нового профиля для пользователя, и на следующем шаге я хочу добавить представление о добавлении ключевых слов / ключевых слов в этот конкретный профиль.

Я передаю внешний ключ параметра - profile_id - через URL, и у меня есть форма сборки из ключевого слова модели.Теперь у меня проблема с передачей их обоих в мою функцию.

models.py

class Profiles (models.Model):
    id_profile = models.AutoField(primary_key=True)
    user_id = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=45)
    description = models.TextField(max_length=120, default=' ')


class Keywords (models.Model):
    id_keyword = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    id_profile = models.ManyToManyField(Profiles)

template

<button class="btn btn-outline-danger" type="submit"> <a href="{% url 'new_keyword' profile_id=object.id_profile %}">new keyword </a></button>

urls.py

path('profile_detail/<int:pk>/', users_view.ProfileDetailView.as_view(), name = 'profile_detail'),
path('new_keyword/<profile_id>/', users_view.NewKeyword, name = 'new_keyword'),

views.py

def newKeyword(request):
    form = NewKeyword(request.POST)
    if request.method == 'POST':
        form.is_valid()
        form.save()
        return redirect('profile')
    return render(request, 'users/new_keyword.html', {'form': form})

Теперь у меня есть

__init__() got an unexpected keyword argument 'profile_id'

Я понимаю, что мне нужно как-то перезаписать init (), чтобы принять profile_id, но я не уверен, как.


ок, спасибо за ответ.Я изменил свой код, но теперь у меня другая проблема: не удалось создать ключевые слова, поскольку данные не были проверены.

def newKeyword(request):
    context = {}
    context['id_profile'] = request.POST.get('id_profile', None)
    form = NewKeyword(request.POST or None)
    if request.method == 'POST':
        form.is_valid()
        obj = form.save(commit=False)
        obj.save()
        obj.id_profile.add(context['id_profile'])
        obj.save()
        return redirect('profile')
    return render(request, 'users/new_keyword.html', {'form': form})

и шаблон на предыдущей странице:

 <form method="POST" name="newkeyword" value='keyword'>
      <fieldset class="form-group">
        <legend class="border-bottom mb-4"> New keyword </legend>
        {{ form | crispy }}
      </fieldset>
      <div class="form-group">
        <button class="btn btn-outline-danger" type="submit">create</button>
      </div>
      </form>

Похоже, что после нажатия кнопки в профиле страницы (чтобы перейти к просмотру: создание ключевого слова) я использую метод POST для отправки параметра, поэтому мой «оператор If» выполняется ...

1 Ответ

0 голосов
/ 10 мая 2019

Вы пытаетесь получить данные GET.

def newKeyword(request, profile_id):

и вы можете получить этот параметр этим способом, но для данных POST, Вы можете использовать;

request.GET.get('profile_id') # GET method
request.POST.get('profile_id') # POST method

и вам не нужно редактировать URL для этого.

связанный вопрос: Передача переменной из шаблона django для просмотра

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