Измените поле формы модели на виджет ввода текста - PullRequest
0 голосов
/ 30 августа 2018

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

Я пробовал следующее:

class SafeTransactionForm(forms.ModelForm):
''' SafeTranSactionForm '''
trans_recipient = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}))
class Meta:
    model = SafeTransaction
    fields = [ 'trans_recipient',
                'subject',
                'arbitrator_name',
                'payment_condition',
                'amount_to_pay']

, который производит это:

enter image description here

и хотя сам виджет изменился, попытка использовать его приводит к ошибке значения следующим образом: enter image description here

без моей неверной однострочной попытки изменить виджет:

class SafeTransactionForm(forms.ModelForm):
''' SafeTranSactionForm '''
class Meta:
    model = SafeTransaction
    fields = [ 'trans_recipient',
                'subject',
                'arbitrator_name',
                'payment_condition',
                'amount_to_pay']

выпадающий список:

enter image description here

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

Проницательность и объяснения очень приветствуются и ценятся.

EDIT:

Теперь я получаю сообщение об ошибке: ValueError: invalid literal for int() with base 10: 'inbox'

Трассировка стека: enter image description here

UpdateView класс:

class SafeTransUpdateView(UpdateView):
'''
    This view lets the user Update a SafeTransaction receipt
    then send an automatic email to the email address
'''
form_class = SafeTransactionForm
model = SafeTransaction
template_name = "myInbox/safeTrans_update.html"

def __init__(self, *args, **kwargs):
    self.request = kwargs.pop('request', None)
    super(SafeTransUpdateView, self).__init__(*args, **kwargs)

def form_valid(self, form):
    trans = form.save(commit=False)
    trans.save()
   ### Send an email to the user upon transaction update.
    usr_obj = User.objects.get(customuser=trans.trans_recipient)
    user_mail = usr_obj.email
    from_email = 'timi.ogunkeye@gmail.com'
    contents = "This transaction [ " +trans.payment_condition+" ] has been updated !"
    email_subject = 'Transaction Update !'
    try:
        send_mail(email_subject, contents, from_email, [user_mail], fail_silently=False)
        pass
    except:
        pass
    else:
        pass
    return HttpResponseRedirect('inbox')

моя обновленная форма:

class SafeTransactionForm(forms.ModelForm):
''' SafeTranSactionForm '''
# trans_recipient = forms.CharField(widget=forms.TextInput(attrs={'class':'special'}))
trans_recipient = forms.ModelChoiceField(queryset=CustomUser.objects.all(),
widget=forms.TextInput(attrs={'value':"username"}), to_field_name="username")

def clean_trans_recipient(self):
    data = self.cleaned_data['trans_recipient']
    try:
        return CustomUser.objects.get(username=data)
    except CustomUser.DoesNotExist:
        raise forms.ValidationError("No user with this username exists")

class Meta:
    model = SafeTransaction
    fields = [  'trans_recipient',
                'trans_recipient_email',
                'subject',
                'arbitrator_name',
                'payment_condition',
                'amount_to_pay']

safeTrans_update.html:

        <h1>TRANSACTION UPDATE: </h1>
        <form action="{% url 'ST_update' object.pk %}" method="post">{% csrf_token %}
            {{ form.as_p }}
            <input type="submit" value="Confirm Update" />   
        </form>

urls.py:

 path('ST_update/<pk>',SafeTransUpdateView.as_view(),name='ST_update'),

Я хотел бы знать, почему эта ошибка происходит сейчас: ValueError: недопустимый литерал для int () с основанием 10: «Входящие». Любая информация очень ценится.

1 Ответ

0 голосов
/ 30 августа 2018

Ну, проблема в том, что Django не знает, как преобразовать данные из поля формы обратно в атрибут trans_recipient для модели (который должен быть экземпляром CustomUser).

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

class SafeTransactionForm(forms.ModelForm):
    ''' SafeTranSactionForm '''
    trans_recipient = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}))

    def <b>clean_trans_recipient</b>(self):
        data = self.cleaned_data['recipients']
        try:
            return CustomUser.objects.get(username=data)
        except CustomerUser.DoesNotExist:
            raise forms.ValidationError("No user with this username exists")

    class Meta:
        model = SafeTransaction
        fields = [ 'trans_recipient', 'subject', 'arbitrator_name',
                   'payment_condition', 'amount_to_pay' ]

Хотя вам, вероятно, потребуется внести некоторые изменения для извлечения CustomUser. Таким образом, мы стремимся получить такой CustomUser и вернуть его. Если такого CustomUser не существует, мы поднимаем ValidationError.

...