Я не уверен, как передать данные из заданного объекта (профиля) и из формы (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» выполняется ...