Django форма модели, добавление идентификатора пользователя при создании новой заметки - PullRequest
0 голосов
/ 04 апреля 2020

Я довольно новичок в Django, я застрял в этом представлении на некоторое время. Моя цель с помощью этой формы - создать небольшую заметку в разделе «Недвижимость» об обслуживании или другой информации. Заметка будет регистрировать время, дату, заметку и пользователя, который записал заметку. Любая помощь будет оценена.

Вид:

@login_required(login_url="login")
def createNote(request, pk):
PropertyNoteFormSet = inlineformset_factory(
    Property, PropertyNote, fields=('note', 'user',))
property_note = Property.objects.get(id=pk)
form = PropertyNoteFormSet(instance=property_note)

# form = OrderForm(initial={'customer': customer})
if request.method == "POST":
    print(request.POST)
    form = PropertyNoteFormSet(
        request.POST, instance=property_note)
    if form.is_valid():
        form.save()
        return redirect("/")

context = {"form": form}
return render(request, "dashboard/create_note.html", context)

Вот здесь ModelForm:

 class PropertyNoteForm(ModelForm):
    class Meta:
      model = PropertyNote
      fields = ['note']
      exclude = ['user']

Вот модель:

 class PropertyNote(models.Model):
        airbnb_name = models.ForeignKey(Property, blank=True, 
        null=True,on_delete=models.CASCADE)
        note = models.TextField(blank=True, null=True)
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        created_on = models.DateTimeField(auto_now_add=True)

        def __str__(self):
            return self.note

Форма содержит около 4 полей для заполнения. В настоящее время она работает, но вам нужно выбрать пользователя, который публикует заметку, я хотел бы, чтобы эта часть обрабатывалась автоматически и использовала текущего вошедшего в систему пользователя. Я думаю, что у меня все еще есть много дыр в моих знаниях об этом, я просто не могу разобраться с этим.

Заранее спасибо.

Редактировать:

Я пробовал это:

def createNote(request, pk):
PropertyNoteFormSet = inlineformset_factory(
    Property, PropertyNote, fields=('note',), extra=1)
property_note = Property.objects.get(id=pk)
form = PropertyNoteFormSet(
    queryset=PropertyNote.objects.none(), instance=property_note)

# form = OrderForm(initial={'customer': customer})
if request.method == "POST":
    print(request.POST)
    form = PropertyNoteFormSet(
        request.POST, instance=property_note)
    if form.is_valid():
        instance = form.save(commit=False)
        instance.user = request.user
        print(instance.user)
        instance.save()
        return redirect("/")

context = {
    "form": form,
    'pk': pk,
}
return render(request, "dashboard/create_note.html", context)

Но я получаю это:

AttributeError at /create_note/75/
'list' object has no attribute 'user'
Request Method: POST
Request URL:    http://127.0.0.1:8000/create_note/75/
Django Version: 3.0.4
Exception Type: AttributeError
Exception Value:    
'list' object has no attribute 'user'

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020
@login_required(login_url="login")
def createNote(request, pk, **kwargs):
    note_form = PropertyNoteForm()
    if request.method == "POST":
        note_form = PropertyNoteForm(request.POST)
        if note_form.is_valid():
            add_note = note_form.save(commit=False)
            add_note.user = request.user
            add_note.airbnb_name = 
      Property.objects.get(id=pk)
            add_note.save()
            return redirect('/property/' + pk + '/')

    context = {
        "form": note_form,
        'pk': pk,
    }
    return render(request, "dashboard/create_note.html", context)

Я решил это с помощью приведенного выше кода. Использование экземпляра было неправильной вещью здесь. Мне не нужно было создавать экземпляр, и мне не нужна встроенная форма. Мне просто нужна была новая форма:

note_form = PropertyNoteForm()

Введенная пользователем информация, мне нужно отправить эту информацию, чтобы проверить, если она действительна:

if request.method == "POST":
note_form = PropertyNoteForm(request.POST)
if note_form.is_valid():

Затем мне нужно было заполнить форму информация, которая еще не была в форме от пользователя:

add_note = note_form.save(commit=False)
add_note.user = request.user
add_note.airbnb_name = Property.objects.get(id=pk)
add_note.save()
return redirect('/property/' + pk + '/')
0 голосов
/ 04 апреля 2020

вы можете использовать request.user.id, чтобы получить зарегистрированный идентификатор пользователя в вашем представлении.

См. Документацию в Django

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